Ich lerne, wie man Entity Relationship Diagrams in SQL DDL-Anweisungen übersetzt und ich bin verwirrt durch Unterschiede in der Notation. Betrachten Sie eine disjunkte Beziehung wie im folgenden Diagramm:
Ich suche nach einer klaren Erklärung des Unterschieds in Bezug auf welche Tabellen Sie für jedes Diagramm erhalten würden.
Es gibt mehrere ER-Notationen. Ich bin nicht vertraut mit dem, den Sie verwenden, aber es ist klar genug, dass Sie versuchen, einen Subtyp zu repräsentieren (aka. Vererbung, Kategorie, Unterklasse, Generalisierungshierarchie ...). Dies ist der relationale Cousin der OOP-Vererbung.
Wenn Sie Subtyping durchführen, sind Sie im Allgemeinen mit folgenden Design-Entscheidungen konfrontiert:
Vehicle
existieren ohne auch 2WD
oder 4WD
? 1
Vehicle
sowohl 2WD
als auch 4WD
? 2 sein
Bike
oder ein Plane
(etc ...) später zum Datenbankmodell hinzugefügt werden kann? Die Information Engineering-Notation unterscheidet zwischen inklusiver und exklusiver Subtyp-Beziehung. Die IDEF1X-Notation hingegen erkennt diesen Unterschied nicht (direkt), unterscheidet aber zwischen einem vollständigen und einem unvollständigen Subtyp (was IE nicht tut).
Das folgende Diagramm aus dem ERwin-Methodenhandbuch (Kapitel 5, Untertypbeziehungen) ) illustriert den Unterschied:
Weder IE noch IDEF1X erlauben direkt die Angabe von abstrakt und konkret übergeordnet.
Leider unterstützen praktische Datenbanken die Vererbung nicht direkt, daher müssen Sie dieses Diagramm in echte Tabellen umwandeln . Hierfür gibt es grundsätzlich drei Ansätze:
2WD
und 4WD
Fahrzeuge mit derselben ID vermeiden möchten). Kann problemlos einschließende vs. ausschließliche Kinder und abstrakte vs. konkrete Eltern erzwingen (indem man einfach die CHECK variiert). Wie Sie sehen, ist die Situation nicht ideal - Sie müssen Kompromisse eingehen, unabhängig davon, welchen Ansatz Sie wählen. Der Ansatz (3) sollte wahrscheinlich Ihr Ausgangspunkt sein, und wählen Sie nur eine der Alternativen, wenn es einen zwingenden Grund dafür gibt.
1 Ich nehme an, das ist die Stärke der Linie in Ihren Diagrammen.
2 Ich vermute, das ist es, was für das Vorhandensein oder Fehlen von "disjoint" in Ihren Diagrammen steht.
Was andere Antwortende gesagt haben, plus das Folgende, das in Primärschlüssel für Unterklassen-Tabellen einfließt.
Ihr Fall sieht wie eine Instanz des Entwurfsmusters aus, das als "Generalisierungsspezialisierung" oder kurz Gen-Spec bezeichnet wird. Die Frage, wie gen-spec mit Hilfe von Datenbanktabellen modelliert wird, kommt in SO immer wieder auf.
Wenn Sie gen-spec in einer OOPL wie Java modellieren würden, würden Sie die Unterklassen-Vererbungsfunktion verwenden, um sich um die Details für Sie zu kümmern. Sie würden einfach eine Klasse definieren, die sich um die verallgemeinerten Objekte kümmert, und dann eine Sammlung von Unterklassen definieren, eine für jeden Typ eines spezialisierten Objekts. Jede Unterklasse würde die verallgemeinerte Klasse erweitern. Es ist einfach und unkompliziert.
Leider enthält das relationale Datenmodell keine Unterklassenvererbung, und die SQL-Datenbanksysteme bieten meines Wissens keine solche Möglichkeit. Aber du bist kein Pech. Sie können Ihre Tabellen so entwerfen, dass sie gen-spec so modellieren, dass sie der Klassenstruktur von OOP entsprechen. Sie müssen dann Ihren eigenen Vererbungsmechanismus implementieren, wenn neue Elemente zur verallgemeinerten Klasse hinzugefügt werden. Details folgen.
Die Klassenstruktur ist ziemlich einfach, mit einer Tabelle für die Genklasse und einer Tabelle für jede Spezifikationsunterklasse. Hier ist eine schöne Illustration von Martin Fowlers Website. Klassentabellenvererbung Beachten Sie, dass in diesem Diagramm Cricketer sowohl eine Unterklasse als auch eine Oberklasse ist. Sie müssen auswählen, welche Attribute in welche Tabellen gehören. Das Diagramm zeigt ein Beispielattribut in jeder Tabelle.
Das heikle Detail ist, wie Sie Primärschlüssel für diese Tabellen definieren. Die Gen-Klasse-Tabelle erhält einen Primärschlüssel in der üblichen Weise (es sei denn, diese Tabelle ist eine Spezialisierung einer weiteren Verallgemeinerung, wie Cricketers). Die meisten Designer geben dem Primärschlüssel einen Standardnamen wie "Id". Sie verwenden die automatische Nummerierung, um das Id-Feld zu füllen. Die Spec-Class-Tabellen erhalten einen Primärschlüssel, der "Id" genannt werden kann, aber die Auto-Nummer-Funktion wird nicht verwendet. Stattdessen wird der Primärschlüssel jeder Unterklassentabelle eingeschränkt, um auf den Primärschlüssel der verallgemeinerten Tabelle zu verweisen. Dies macht jeden der spezialisierten Primärschlüssel zu einem Fremdschlüssel sowie einem Primärschlüssel. Beachten Sie, dass im Falle von Cricketers das Id-Feld auf das Id-Feld in Playern verweist, das Id-Feld in Bowlern jedoch auf das Id-Feld in Cricketers.
Wenn Sie jetzt neue Elemente hinzufügen, müssen Sie die referenzielle Integrität beibehalten. So geht's.
Sie fügen zuerst eine neue Zeile in die Gen-Tabelle ein und stellen Daten für alle Attribute außer dem Primärschlüssel bereit. Der automatische Nummerierungsmechanismus generiert einen eindeutigen Primärschlüssel. Als Nächstes fügen Sie eine neue Zeile in die entsprechende Spezifikationstabelle ein, einschließlich Daten für alle Attribute einschließlich des Primärschlüssels. Der Primärschlüssel, den Sie verwenden, ist eine Kopie des gerade generierten Primärschlüssels. Diese Propagierung des Primärschlüssels kann als Vererbung des armen Mannes bezeichnet werden.
Wenn Sie jetzt alle verallgemeinerten Daten zusammen mit allen spezialisierten Daten aus nur einer Unterklasse benötigen, müssen Sie nur die beiden Tabellen über die gemeinsamen Schlüssel verbinden. Alle Daten, die nicht zu der betreffenden Unterklasse gehören, werden aus dem Join gelöscht. Es ist glatt, leicht und schnell.
Wenn Sie in Ihrem Datenbankentwurf eine Beziehung vom Typ Super-Typ / Untertyp verwenden, müssen Sie normalerweise eine separate Tabelle für Ihren Typ der allgemeinen Entität (Super-Typ) und separate Tabellen für Ihre Version (en) der spezialisierten Entität erstellen -Typ) unzusammenhängend oder nicht. In Ihrem Fall müssen Sie eine Tabelle für VEHICLE und einen Primärschlüssel sowie einige Attribute erstellen, die allen Untertypen gemeinsam sind oder von ihnen geteilt werden. Dann müssen Sie separate Tabellen für den 2WD und 4WD zusammen mit Attributen erstellen, die nur für diese Tabellen spezifisch sind. Zum Beispiel
Dann könnten Sie diese Tabellen mit SQL-Joins
abfragenEs gibt nicht immer nur eine Möglichkeit, ein bestimmtes Datenmodell zu implementieren. Häufig tritt eine Transformation auf, wenn Sie von einem logischen Modell zu einem physischen Modell wechseln.
Standard-SQL bietet keine saubere Möglichkeit, disjunkte Subtype-Einschränkungen zu erzwingen.
Wenn Sie so viele Regeln Ihres Modells wie möglich mithilfe des Schemas erzwingen möchten, verwenden Sie standardmäßig eine Tabelle für den Supertyp und eine für jeden Subtyp. Dies stellt sicher, dass nur anwendbare Attribute für jede Entität verwendet werden.
Es gibt einen mehr oder weniger standardmäßigen SQL-Trick zum Erzwingen der disjunkten Einschränkung. Es bringt einige Leute davon ab, weil es die Normalisierungsregeln auf unwichtige Weise verletzt. Dennoch finden manche Leute die Technik ästhetisch beleidigend, da es eine technische Verletzung von 2NF gibt.
Diese Technik beinhaltet das Hinzufügen eines Partitionierungsattributs zum Supertyp und das Einbeziehen dieses Partitionierungsattributs in jeden Subtyp, indem es zum Primärschlüssel des Subtyps hinzugefügt wird. Zusammen mit Prüfbedingungen, die bestimmte Werte für die Partitionierungsattribute festlegen, wird sichergestellt, dass jede Entität höchstens einen Subtyp haben kann. Die Technik ist an vielen Stellen detailliert dokumentiert, zum Beispiel dieser Blog .
Tags und Links database database-design entity-relationship erd