Hilfe bei Datenbankmodellierung

Behaelter

Neuer Benutzer
Beiträge
3
Hallo allerseits,
Ich bräuchte dringend Hilfe bei der Erweiterung einer Datenbank.
Mir geht es aber erstmal nur ums Modell.
Anbei erstmal das ER-Diagramm der Datenbank die ich bisher habe.
Dazu erstmal eine Erklärung, weil die Modellierung vlt da nicht ganz sauber ist:
Gehoert ein Nutzer zu einer Organisation, so gehoert er auch automatisch zu allen Unterorganisationen. Um das zu Verwirklichen, habe ich natürlich nicht alle Beziehungen von Nutzer und Organisation eingefügt in der Datenbak abgespeichert. Das war ja bisher noch nicht nötig.
Jetzt würde ich gerne noch ein neues Feature hinzufügen:
Jeder Nutzer, der in einer Organisation ist, soll auch Rechte in dieser Organisation haben und allen Unterorganisationen. Aber in den Unterorganisationen sollen es evtl. andere Rechte sein als in der eigentlichen Organisation.
Das Problem ist also: Erst habe ich Rechte als Attribut der Relation vin Nutzer zu Organisation modelliert. Um dann zumerken, dass ich so natürlich keine Rechte zu den Untergruppen abgespeichert habe. Vlt müsste ich jetzt doch jede einzelne Bezeihung zwischen Nutzer und Organisation abspeichern. Was aber auch doof wäre, wegen der Abfrage...
Ich hoffe einer von euch hatt eine gute Lösung, oder kann mir eine schon von mir angesprochene empfehlen...
lg Behaelter
 

Anhänge

  • Datenbank ER-Diagramm Teil 1.png
    Datenbank ER-Diagramm Teil 1.png
    33,6 KB · Aufrufe: 4
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
Gehoert ein Nutzer zu einer Organisation, so gehoert er auch automatisch zu allen Unterorganisationen. Um das zu Verwirklichen, habe ich natürlich nicht alle Beziehungen von Nutzer und Organisation eingefügt in der Datenbak abgespeichert. Das war ja bisher noch nicht nötig.
Jetzt würde ich gerne noch ein neues Feature hinzufügen:
Jeder Nutzer, der in einer Organisation ist, soll auch Rechte in dieser Organisation haben und allen Unterorganisationen. Aber in den Unterorganisationen sollen es evtl. andere Rechte sein als in der eigentlichen Organisation.

Also mußt definieren, wie die Suborgs zu den Organisationen gehören (sub_org - Table) und welche Rechte welcher Nutzer in welcher Suborg hat (nutzer_rechte).

Code:
test=# create table nutzer (id serial primary key, name text, email text);
NOTICE:  CREATE TABLE will create implicit sequence "nutzer_id_seq" for serial column "nutzer.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "nutzer_pkey" for table "nutzer"
CREATE TABLE
Time: 427,705 ms
test=*# create table organisation (id serial primary key, name text);
NOTICE:  CREATE TABLE will create implicit sequence "organisation_id_seq" for serial column "organisation.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "organisation_pkey" for table "organisation"
CREATE TABLE
Time: 18,956 ms
test=*# create table sub_org(id serial primary key, org int references organisation, suborg_name text);
NOTICE:  CREATE TABLE will create implicit sequence "sub_org_id_seq" for serial column "sub_org.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "sub_org_pkey" for table "sub_org"
CREATE TABLE
Time: 52,380 ms
test=*# create table nutzer_rechte (id serial primary key, nutzer int references nutzer, sub_org int references sub_org, rechte text);
NOTICE:  CREATE TABLE will create implicit sequence "nutzer_rechte_id_seq" for serial column "nutzer_rechte.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "nutzer_rechte_pkey" for table "nutzer_rechte"
CREATE TABLE
Time: 81,296 ms

Vielleicht so? Als Grobansatz. Sicherlich sind die Rechte dann nicht als Text definiert, aber das ist ja nicht die Frage jetzt.


Andreas
 

Behaelter

Neuer Benutzer
Beiträge
3
sry, dass ich so lange nicht geantwortet habe. Bin umgezogen und hatte noch kein internet ... :-(
ich hab aber trotzdem noch ne frage zu deinem Vorschlag. Ein eintrag in der table "nutzer_rechte" wuerde dann sowohl eine Relation zwischen einem nutzer und einer organisation darstellen, als auch die rechte speichern. Wuerde das nicht in etwa diesem hier gleich kommen:
Vlt müsste ich jetzt doch jede einzelne Bezeihung zwischen Nutzer und Organisation abspeichern. Was aber auch doof wäre, wegen der Abfrage...
Und des kommt mir leider sehr redundant vor. Obwohl schon impliziert ist, dass ich eine Relation zu einer sub_org habe, wenn ich zur entsprechenden oberorganisation schon eine relation habe. Aber vlt ist es doch die beste Loesung. Verbraucht halt unnoetig speichplatz und ist irgendwie haesslich.
Warum machst du eigentlich eine org und eine sub_org als eigene table. Des ist irgendwie auch doof. Erstens sollst ja ewig geschachtelt sein und zweitens kann man dann nicht so einfach eine org zu einer sub_org einer anderen machen. Ich hoffe du verstehtst jetzt mein problem. Danke schonmal fuer die Hilfe.
 

akretschmer

Datenbank-Guru
Beiträge
9.028
sry, dass ich so lange nicht geantwortet habe. Bin umgezogen und hatte noch kein internet ... :-(
ich hab aber trotzdem noch ne frage zu deinem Vorschlag. Ein eintrag in der table "nutzer_rechte" wuerde dann sowohl eine Relation zwischen einem nutzer und einer organisation darstellen, als auch die rechte speichern. Wuerde das nicht in etwa diesem hier gleich kommen:

Das bezog sich Deiner Forderung, daß je Nutzer und Sub-Org spezifische Rechte sein können.
da fehlt aber wohl noch eine Zuordnung Nutzer->Organisation, denn ein Nutzer gehört ja wohl nicht zu ALLEN Organisationen.

Und des kommt mir leider sehr redundant vor. Obwohl schon impliziert ist, dass ich eine Relation zu einer sub_org habe, wenn ich zur entsprechenden oberorganisation schon eine relation habe.
Du hast Nutzer und Organisationen. Nicht jeder Nutzer ist in allen Organisationen. Ist er in einer, so ist er auch in allen Unter-Orgs. So hab ich Dich verstanden. Nur hat er da spezifische Rechte. Also muß man Nutzer und Organisation darstellen und Nutzer und Unter-Org und da die Rechte. So hab ich es zumindest verstanden.

Aber vlt ist es doch die beste Loesung. Verbraucht halt unnoetig speichplatz und ist irgendwie haesslich.

Zeig wie es besser geht.

Jedenfalls denke ich, Du mußt 2 Dinge trennen:

  • die Darstellung der Organisationsform. Im ersten Post war da nur eine Tiefe von 2 Ebenen, scheinbar willst Du aber beliebig tief verschachteln.
  • die Abbildung der Rechte eines Users auf einen beliebigen Knoten dieser Organisationsform

Das erfordert dann doch einige Tabellen und Verbindungen dazwischen. Da scheiden wohl schon mal mittelalterliche MyISAM-Konstrukte aus ...,
damit die DB auch referrentielle Constraints erzwingen kann.

Warum machst du eigentlich eine org und eine sub_org als eigene table. Des ist irgendwie auch doof. Erstens sollst ja ewig geschachtelt sein

Davon war bisher keine Rede. Es gab bisher nur Organisationen und UnterOrganisationen. Aber keine UnterUnterOrganisationen und auch keine UnterUnterUnterOrganisationen.
In beliebiger Tiefe. Wenn Du das willst, mußt Du anders rangehen.

Wie man das in PG machen könnte, hab ich hier mal gezeigt: https://www.datenbankforum.com/threads/select-abfrage-kategoriebaum.1007/ . Oder http://dcparris.net/2013/02/24/using-ltree-hierarchical-postgresql/ , hab ich aber noch nicht selber mit gespielt. Auf alle Fälle werden solche rekursiven Dinge a Stück weit anspruchsvoller und hängen dann auch stark von dem ab, was das verwendete DB-System bietet.


Andreas
 
Werbung:

Behaelter

Neuer Benutzer
Beiträge
3
Hey Danke für deine schnelle Antwort.
Einzugsfete ist in Erlangen... wann weiß ich noch nicht. Also zurück zum eigentlichen Problem.
Ich hab mich da wohl nicht klar ausgedrückt. Die Verschachtelungstiefe ist nicht festgelegt. D.h. man soll tatsächlich erstmal so viele Untergruppen (in der Tiefe) anlegen können wie man will. Natürlich auch in der Breite. Dazu kommt dann noch die ganze Geschichte mit den Rechten.
Zeig wie es besser geht.
Würdich gerne. Aber ich hab keine Ahnung. Desshalb frag ich ja.

Jedenfalls denke ich, Du mußt 2 Dinge trennen:

die Darstellung der Organisationsform.
Also durch organisation und Sub_organisation? Kann man da nicht einfach nur eine table "organisation" machen und eine zweite "untergeordnet", wo man jeweils eine organisation einer anderen unterordnen kann?

die Abbildung der Rechte eines Users auf einen beliebigen Knoten dieser Organisationsform
Also vlt doch wieder so wie angedacht einfach durch noch eine Table "nutzer_rechte" und zu jeden nutzer die enprechenden (organisationen/sub_organisationen)(was ja dann des selbe wäre evtl.) + rechte

lg Behaelter
 
Oben