Datenbankmodell vereinfachen

Falc410

Vice Admiral
Registriert
Juni 2006
Beiträge
6.423
Ich versuche gerade folgende Struktur umzusetzen.
In meinem System soll es User, MasterUser und Institute geben. Institute und User sind eigene Tabellen / Klassen. MasterUser soll entweder durch ein Attribut oder eine Relation realisiert werden.

Jeder User ist einem Institut zugewiesen und jedes Institut hat genau einen MasterUser.

Das ganze wird in Python / Django realisiert, d.h. ich einen ORM benutzen und muss nur Klasse schreiben. Also hat die Klasse User ein Feld Institut und dort den PK des Instituts drinnen. Somit weiß ich, User X gehört zu Institut Y.

Die Klasse Institut hat ein Feld MasterUser und dort den PK von einem User wiederum drinnen. Das ist allerdings etwas unschön. Ich frage mich wie ich das besser lösen kann.

User - Institut ist also eine n:1 Beziehung
Institut - (Master)User ist eine 1:1 Beziehung

Wenn ich isMasterUser als boolean Attribut von User mache dann muss ich manuell immer prüfen dass es nicht schon einen gibt. Auch unschön.

Muss ich dann eine neue Klasse MasterUser anlegen die Einträge jeweils PK von User und Institut nimmt? Aber für jedes Institut darf es dann nur einen Eintrag geben (sollte sicher irgendwie machbar sein).

Oder übersehe ich einen besseren Ansatz im Moment?
 
Falc410 schrieb:
Wenn ich isMasterUser als boolean Attribut von User mache dann muss ich manuell immer prüfen dass es nicht schon einen gibt. Auch unschön.

Das ist aber der richtige Ansatz. Von der Logik her darfst du aber gar kein Problem haben. Wann und warum willst du denn prüfen ob es schon einen Master gibt? Soweit ich verstanden habe muss ein Institut immer einen MasterUser haben, der somit schon existieren muss wenn du das Institut anlegst. Du definierst den MasterUser also beim anlegen des Instituts, nicht beim anlegen Users. Das macht eine Prüfung obsolet da das Institut noch gar keinen MasterUser haben kann. Die einzige Prüfung die du hier einbauen musst ist, dass du keinen User auswählen kannst der schon einem Institut zugewiesen ist.

Wenn du einen User anlegst gibt es das Institut inkl. MaterUser schon, warum solltest du bei diesem Schritt noch die Wahl haben ihn als MasterUser zu deklarieren. Keine Notwendigkeit.

Von der Logik her kommst du nur ein einziges Mal in die Verlegenheit das zu checken, und zwar wenn du den MasterUser ändern willst. Und für diesen Schritt solltest du eine eigene Routine schreiben die exakt dass macht und die anderen Möglichkeiten (ob User schon MasterUser ist, den alten MU raushauen bevor der neue eingetragen wird usw.) berücksichtigt.
 
Zuletzt bearbeitet:
Danke, du hast natürlich vollkommen Recht.

Wenn ein Institut angelegt wird, dann muss es dazu auch einen Master User geben. Für mich war intuitiv halt der Weg über das Institut den User zu suchen. Nun müsste ich alle User nach Institut ID filtern und dann noch einmal nach dem MasterUser boolean (ja das geht natürlich in einer Abfrage, erscheint mir trotzdem aufwendiger).

Ich hatte halt immer Angst, wenn es sich um ein Attribut von einem User handelt, dass das dann nachträglich modifiziert werden kann. Ich muss auf jeden Fall verhindern das auf einmal mehrere MasterUser existieren - sonst wären die Daten ja inkonsistent.

Trotzdem vielen Dank - ich werde das Modell dann entsprechend anpassen.
 
Zurück
Oben