EINLEITUNG UND RELEVANTE INFORMATIONEN:
Das folgende Beispiel zeigt das Problem, mit dem ich konfrontiert bin:
Tier hat eine Rasse, die eine Katze oder ein Hund sein kann . Katze kann entweder siamesisch oder persisch sein . Hund kann ein deutscher Schäferhund oder Labrador Retriver sein .
Tier ist eine starke Einheit, während seine Rasse ein Attribut ist, das einen der beiden angebotenen Werte haben kann (Katze oder Hund). Diese beiden Werte sind komplex (ich habe hier nur den Typ des Hundes / der Katze hinzugefügt, um das Problem zu veranschaulichen, aber es kann auch den Namen der Katze / des Hundes und eine Reihe anderer Dinge geben).
PROBLEM:
Ich weiß nicht, wie ich für dieses Beispiel relationale Tabellen erstellen soll.
Meine Bemühungen, das Problem zu lösen:
Ich habe versucht, ein ER-Diagramm mit Chens Notation zu zeichnen, das das Problem darstellt, aber als Anfänger weiß ich nicht, ob ich es richtig gemacht habe. Folgendes habe ich:
Ich entschuldige mich, wenn ich etwas falsch gezeichnet habe. Bitte korrigieren Sie mich, wenn dies der Fall ist. Ich möchte nicht nur eine "kostenlose Lösung" erhalten, sondern auch lernen, mit diesem Problem umzugehen, damit ich es in Zukunft selbst lösen kann.
Ich denke nur daran, zwei separate Tische zu erstellen, einen für Katzen und einen für Hunde. Auch das Rennen Attribut in dem Tiere würde Tabelle nur speichern , Katze oder einen Hund Wert. Etwas wie das:
Animal< # Animal_ID, race, other attributes >
Cat < # Cat_ID, $ Animal_ID, breed >
Dog < # Dog_ID, $ Animal_ID, breed >
Ich habe wirklich ein schlechtes Gefühl bei meiner Lösung und ich befürchte, dass sie falsch ist, daher die folgende Frage.
FRAGEN:
- Wie kann ich mein Beispiel in ein ER-Diagramm umwandeln?
- Wie kann man dieses ER-Diagramm in relationale Tabellen umwandeln?
Wenn weitere Informationen benötigt werden, hinterlasse einen Kommentar und ich werde meinen Beitrag so schnell wie möglich aktualisieren. Fühlen Sie sich auch frei, entsprechende Tags hinzuzufügen, da ich hier ziemlich neu bin.
Danke.
quelle
Antworten:
Die richtige Struktur für dieses Szenario ist ein SubClass / Inheritance-Modell und ist nahezu identisch mit dem Konzept, das ich in dieser Antwort vorgeschlagen habe: Heterogen geordnete Werteliste .
Das in dieser Frage vorgeschlagene Modell ist insofern ziemlich ähnlich, als die
Animal
Entität den Typ (dhrace
) und die Eigenschaften enthält, die für alle Typen gleich sind. Es sind jedoch zwei geringfügige Änderungen erforderlich:Entfernen Sie die Felder Cat_ID und Dog_ID aus ihren jeweiligen Entitäten:
Der Schlüsselbegriff ist hier, dass alles ist
Animal
, und zwar unabhängig vonrace
:Cat
,Dog
,Elephant
, und so weiter. Angesichts dieses Ausgangspunkts benötigt eine bestimmterace
vonAnimal
nicht wirklich eine separate Kennung, da:Animal_ID
ist einzigartigCat
,Dog
und alle zusätzlichenrace
Einheiten in der Zukunft hinzugefügt dies nicht tun, indem sie sich, voll einen bestimmten darstellenAnimal
; Sie haben nur dann eine Bedeutung, wenn sie in Kombination mit den in der übergeordneten Entität enthaltenen Informationen verwendet werdenAnimal
.Daher ist die
Animal_ID
Eigenschaft in derCat
,Dog
etc Einheiten ist sowohl der PK und der FK an der RückseiteAnimal
Einheit.Unterscheiden Sie zwischen Arten von
breed
:Nur weil zwei Eigenschaften denselben Namen haben, bedeutet dies nicht unbedingt, dass diese Eigenschaften gleich sind, auch wenn der gleiche Name eine solche Beziehung impliziert . In diesem Fall ist das, was Sie wirklich haben, tatsächlich
CatBreed
undDogBreed
als separate "Typen".Erste Hinweise
VARCHAR
aber wenn Sie etwas außerhalb des Standard-ASCII-Satzes speichern müssen, sollten Sie es wirklich verwendenNVARCHAR
.Race
,CatBreed
, undDogBreed
) sind nicht automatisch inkrementierende (dh IDENTITY in Bezug auf die T-SQL) , weil sie Anwendung Konstanten sind (dh sie sind Teil der Anwendung sind) , die statische Nachschlagewerte in der sind Datenbank und werden alsenum
s in C # (oder anderen Sprachen) dargestellt. Wenn Werte hinzugefügt werden, werden sie in kontrollierten Situationen hinzugefügt. Ich behalte mir die Verwendung von Auto-Inkrement-Feldern für Benutzerdaten vor, die über die Anwendung eingehen."Rasse" als "Rasse" -Spezifischer Ansatz
Diese erste Gruppe von Tabellen sind die Nachschlagetabellen / Typen:
Diese zweite Auflistung ist die Hauptentität "Tier":
Dieser dritte Satz von Tabellen sind die komplementären Unterklassenentitäten, die die Definition
Race
vonAnimal
:Das Modell, das einen gemeinsam genutzten
breed
Typ verwendet, wird nach dem Abschnitt "Zusätzliche Hinweise" angezeigt.Zusätzliche Bemerkungen
breed
scheint ein Brennpunkt für Verwirrung zu sein. Es wurde von jcolebrand (in einem Kommentar zu der Frage) vorgeschlagen, dassbreed
es sich um eine Eigenschaft handelt, die von den verschiedenenrace
s gemeinsam genutzt wird, und die beiden anderen Antworten haben sie als solche in ihre Modelle integriert. Dies ist jedoch ein Fehler, da die Werte fürbreed
nicht auf die verschiedenen Werte von aufgeteilt werdenrace
. Ja, mir ist bekannt, dass die beiden anderen vorgeschlagenen Modelle versuchen, dieses Problem zu lösen, indem sierace
ein Elternteil von machenbreed
. Während dies das Beziehungsproblem technisch löst, hilft es nicht, die allgemeine Modellierungsfrage zu lösen, was mit nicht allgemeinen Eigenschaften zu tun ist oder wie mit einer zu umgehen istrace
, die keine hatbreed
. Aber für den Fall, dass eine solche Eigenschaft garantiert über alle existieren würdeAnimal
s, ich werde auch eine Option dafür einschließen (unten).Animal
) oderrace
s in derAnimal
Entität gespeichert werden , was eine sehr flache (und nahezu nicht relationale) Art der Darstellung dieser Daten darstellt. Ja, die Leute tun dies die ganze Zeit, aber es bedeutet, dass viele NULL-Felder pro Zeile für die Eigenschaften vorhanden sind, die nicht für diesen bestimmten bestimmt sind,race
UND dass sie wissen, welche Felder pro Zeile mit dem jeweiligenrace
Datensatz verknüpft sind .race
vonAnimal
in der Zukunft, das nichtbreed
als Eigenschaft hat. Und selbst wenn ALLEAnimal
einebreed
haben, würde dies die Struktur nicht ändern, aufgrund dessen, was zuvor erwähnt wurdebreed
: Dasbreed
hängt von der abrace
(dhbreed
fürCat
ist nicht dasselbe wiebreed
fürDog
)."Rasse" als Common- / Shared-Property-Ansatz
Bitte beachten Sie:
Die folgende SQL kann in derselben Datenbank wie das oben dargestellte Modell ausgeführt werden:
Race
Tabelle ist die gleicheBreed
Tisch ist neuAnimal
Tabellen wurden mit a angehängt2
Breed
wenn es sich um eine jetzt übliche Eigenschaft handelt, scheint es nicht richtig zu seinRace
, dies nicht in der Haupt- / Mutterentität vermerkt zu haben (selbst wenn es technisch relational korrekt ist). Also beideRaceID
undBreedID
sind in vertretenAnimal2
. Um eine Nichtübereinstimmung zwischen demRaceID
vermerkten inAnimal2
und einemBreedID
anderen zu verhindernRaceID
, habe ich auf beiden eine FK hinzugefügtRaceID, BreedID
, die auf eine EINZIGARTIGE EINSCHRÄNKUNG dieser Felder in derBreed
Tabelle verweist . Normalerweise verachte ich es, einen FK auf eine EINZIGARTIGE EINSCHRÄNKUNG zu verweisen, aber hier ist einer der wenigen triftigen Gründe dafür. Eine EINZIGARTIGE EINSCHRÄNKUNG ist logischerweise ein "alternativer Schlüssel", der sie für diese Verwendung gültig macht. Bitte beachten Sie auch, dass in derBreed
Tabelle nur noch eine PK aktiviert istBreedID
.BreedID
über verschiedene Werte von wiederholt werden kannRaceID
.BreedID
ist. Daher sollte es weiterhin möglich sein, auf einen bestimmten Wert von zu verweisen,Breed
ohne über denRaceID
verfügbaren Wert zu verfügen .Breed
(und deshalb bevorzuge ich dieRace
spezifischenBreed
Tabellen).Breed
dieselben Eigenschaften haben. Es gibt in diesem Modell keine einfache Möglichkeit, unterschiedliche Eigenschaften zwischenDog
"Rassen" undElephant
"Rassen" zu haben. Es gibt jedoch noch eine Möglichkeit, dies zu tun, die im Abschnitt "Endgültige Bearbeitung" aufgeführt ist.Breed
ein Rennen über mehrere Rennen hinweg zu teilen . Ich bin mir nicht sicher, ob dies wünschenswert ist (oder vielleicht nicht im Konzept der Tiere, aber möglicherweise in anderen Situationen, in denen diese Art von Modell verwendet wird), aber dies ist hier nicht möglich.Final Edit (hoffentlich ;-)
Breed
, es ist möglich , das gleiche Unterklasse / Vererbungskonzept , aber mit beschäftigenBreed
als Haupteinheit. In diesem Setup hätte dieBreed
Tabelle die Eigenschaften, die allen Typen vonBreed
(genau wie dieAnimal
Tabelle) gemeinsam sind, undRaceID
würde den Typ von darstellenBreed
(genau wie in derAnimal
Tabelle). Dann würden Sie Unterklasse - Tabellen wieBreedCat
,BreedDog
und so weiter. Für kleinere Projekte dies könnte „over-engineering“ betrachtet werden, sondern als Option wird für Situationen genannt , die davon profitieren würden.Bei beiden Ansätzen ist es manchmal hilfreich, Ansichten als Verknüpfungen zu den vollständigen Entitäten zu erstellen. Betrachten Sie zum Beispiel:
CreatedDate
DerAnimal
Tabelle wird ein Feld hinzugefügt . Dieses Feld wird in keiner der Unterklassentabellen (z. B.AnimalCat
) benötigt, da die Zeilen, die für beide Tabellen eingefügt werden, innerhalb einer Transaktion gleichzeitig ausgeführt werden sollen.LastModifiedDate
DerAnimal
Tabelle und allen Unterklassentabellen wird ein Feld hinzugefügt . Dieses Feld wird nur aktualisiert, wenn diese bestimmte Tabelle aktualisiert wird: Wenn eine Aktualisierung in,AnimalCat
aber nicht inAnimal
einer bestimmten Tabelle erfolgtAnimalID
, wird nur dasLastModifiedDate
Feld inAnimalCat
festgelegt.quelle
D
, daher wollte ich die Methode aus Ihrer Antwort anwenden. Zwei Entitäten haben ein gemeinsames Attribut,E
das in der dritten Entität nicht vorhanden ist. Sollte ich diese Tatsache ignorieren und eine Standardlösung anwenden, oder gibt es eine Möglichkeit, mein Design weiter zu optimieren?Zunächst einmal tun Sie gut daran, zwischen ER-Modellierung und relationaler Modellierung zu unterscheiden. Viele Neulinge tun das nicht.
Hier sind einige Schlagworte, mit denen Sie hilfreiche Artikel im Web nachschlagen können.
Ihr Fall ist ein klassischer Fall von Klasse / Unterklasse oder, wenn Sie möchten, Typ / Untertyp.
Der in der ER-Modellierung verwendete Ausdruck lautet "Generalisierung / Spezialisierung". Viele Artikel zeigen dies unter der Bezeichnung EER-Modellierung (Enhanced Entity-Relationship). Dies war nicht in Peter Chens ursprünglicher Präsentation der ER-Modellierung. Es wurde später hinzugefügt. Für eine ziemlich gute Zusammenfassung von gen / spec im PDF-Format klicken Sie hier
Wenn Sie einen Klassen- / Unterklassenfall in eine relationale Modellierung konvertieren, entwerfen Sie als Nächstes Tabellen. Es gibt mehr als einen Ansatz. Die beiden Hauptansätze werden als Einzeltabellenvererbung und Klassentabellenvererbung bezeichnet. Jeder hat Vor- und Nachteile. Die beste Präsentation dieser beiden Designs stammt von Martin Fowler. Sie können seinen Umriss hier und hier sehen .
Der große Vorteil der Vererbung einzelner Tabellen ist die Einfachheit. Es ist alles in einer Tabelle gespeichert. Der große Nachteil ist viele NULL. Dies kann Raum und Zeit verschwenden und zu verwirrender Logik führen.
Für die Vererbung von Klassentabellen sind Verknüpfungen erforderlich, die jedoch einfach und schnell sind. Insbesondere, wenn Sie eine Technik verwenden, die als gemeinsam genutzter Primärschlüssel bezeichnet wird und bei der die PK in den Unterklassentabellen eine Kopie der PK in der Oberklassentabelle ist. Sie können Ansichten für jede Unterklasse erstellen, die Oberklassendaten mit Unterklassendaten verknüpfen.
Schließlich gibt es in diesem Bereich ein Tag, das Fragen wie Ihre zusammen sammelt.
Hier ist es: Subtypen
quelle
Ich sehe auf mögliches Design als
Tabelle
Race
Tabelle
Breed
Tabelle
Animal
Diese PKs oben wären automatisch inkrementierende Spalten. Andere Spalten in der
Animal
Tabelle könnten entsprechend benannt werden.quelle
Ihre aktuelle Methode ist nicht schlecht. Wenn Sie jedoch später weitere Rennen hinzufügen (Vogel, Fisch usw.), kann es umständlich sein, für jedes Rennen eine eigene Tabelle zu erstellen. Ich würde Folgendes empfehlen:
Eine Rasse sollte meines Wissens nur eine Rasse haben. Wenn Sie also die Rasse in der Tiertabelle speichern, können Sie die Rasse bestimmen, indem Sie sich der Rassetabelle anschließen. Fügen Sie nach Bedarf weitere Attribute (Name, Beschreibung usw.) zu den Rassen- und Renntabellen hinzu.
quelle