Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Datenbankdesign One-to-Many-to-Many

Beginnen Sie immer damit, Ihre Tabellen in der dritten Normalform (3NF) zu entwerfen. Es ist durchaus akzeptabel, zu geringeren Formen zurückzukehren (normalerweise aus Leistungsgründen), vorausgesetzt, Sie verstehen und mindern die Auswirkungen, aber fangen Sie an mit 3NF.

Die (leicht vereinfachte) Regel, die Sie sich merken sollten, lautet, dass jede Nicht-Schlüsselspalte in einer Tabelle abhängen sollte von:

  • der Schlüssel,
  • der ganze Schlüssel,
  • und nichts als den Schlüssel,
  • "also hilf mir, Codd" - ein bisschen DBA-Humor (und ich meine "wenig").

Die erste Frage ist ziemlich einfach.

Eins-zu-viele-Beziehungen werden am besten als Fremdschlüssel in der „Viele“-Tabelle dargestellt. Was Sie vorschlagen, ist also vernünftig. Damit können Sie die Beziehung automatisch einschränken. Wenn Sie eine separate Verknüpfungstabelle hätten (die für Viele-zu-Viele verwendet wird), müssten Sie auf "Tricks" zurückgreifen, um die Eins-zu-Viele-Beziehung zu erzwingen.

Was Ihre zweite Frage betrifft, müssen Sie sich die obige "Codd"-Regel ansehen und sich überlegen:Was genau stellen diese Zeilen in jeder Tabelle dar? Wenn eine Arbeitsaufgabenaktion ein von einer Arbeitsaufgabe verschiedenes Objekt ist (sie können verwandt sein aber wenn sie nicht dasselbe Objekt darstellen, sind sie unterschiedlich), sollten sie in verschiedenen Tabellen sein.

Außerdem scheinen Sie dort eine Eins-zu-Viele-Beziehung zu haben (ein Element kann viele Aktionen haben), also sollten sie allein aus diesem Grund in verschiedenen Tabellen sein.

Was Ihre Frage zu den redundanten Informationen betrifft:ob sie wirklich sind überflüssig, sie sollten repariert werden.

Mit step_num Was bedeutet das zum Beispiel genau? Wenn es sich um ein Attribut des Arbeits-item handelt es sollte nicht in der Arbeit Aktion sein Tisch überhaupt.

Sie würden es von dort loswerden und, wenn Sie die Schrittnummer für eine Zeile in der Arbeitsaktionstabelle wissen wollten, würden Sie mit der Arbeitsaufgabentabelle unter Verwendung des Fremdschlüssels verknüpfen.

Wenn es sich stattdessen um ein Attribut der Arbeitsaktion handelt, sollten Sie es aus der Arbeitsaufgabentabelle entfernen, da es keinen Sinn macht. Möglicherweise haben Sie zwei Aktionen mit jeweils unterschiedlichen Schrittnummern. Wie lautet die Schrittnummer des übergeordneten Elements in diesem Fall?

Natürlich können Sie einen eindeutigen haben Schrittnummer für beide Elemente und Aktionen - in diesem Fall würde ich eine Umbenennung in Betracht ziehen, um die Absicht klar zu machen, so etwas wie item_step_num und action_step_num .

Fazit ist, mit 3NF zu beginnen. Wenn Ihre Datenbank irgendwann zu langsam läuft, dann Betrachten Sie die Rückkehr zu einer niedrigeren Form. Sie können dann anderen fragen Frage hier, wie die daraus entstehenden Probleme erkannt und gemildert werden können (z. B. die Möglichkeit inkonsistenter Daten an zwei Stellen und die Verwendung von Triggern, um dies zu verhindern).