Wie können Sie eine Beziehung null, eine oder viele Typen modellieren, ohne die erste Normalform zu unterbrechen? Das heißt, keine NULL-Werte speichern.So modellieren Sie eine optionale 1: n-Beziehung in 1NF
Getrennte Beziehungstabelle? Ist es "wert", eine Tabelle hinzuzufügen, oder ist dies eine Über-Normalisierung?
Hier ist ein Beispiel, das zu meiner realen Welt Fall entspricht:
Sagen wir ein College haben, mit einigen freien Kursen und einigen freien Schlafsäle. Einige der Kurse und Schlafsäle sind jedoch mit einer Gebühr verbunden. Und viele der Kurse und Zimmer haben die gleiche Gebühr (Betrag), obwohl sie verschiedene Kurse/Zimmer sind.
wir So haben:
tblCourse
Id
Name
tblDormRoom
Id
Address
tblFee
Id
Amount
Um dieses mein nehmen zu modellieren war zwei Tabellen hinzufügen, um die optional eine Eins-zu-viele-Beziehung zu halten.
tblCourseToFee
CourseId
FeeId
tblDormRoomToFee
DormRoomId
FeeId
So kann ich keine Nullwert zu speichern vermeiden kann, und auch doppelte Speicherung der Fee vermeiden, die zwischen Dormroom und Kurs geteilt werden.
Und die schnelle n dreckige Version betrachtet, die nicht streng an 1NF anhaftet:
tblFee
Id
CourseId (nullable)
DormRoomId (nullable)
Amount
Dies nur eine Tabelle anstelle von drei verwendet, aber NULL-Werten führt ..
Was ist, wenn Sie eine zweite Parent2-Tabelle mit der gleichen optionalen Eins-zu-viele-Beziehung zur Tabelle Child haben? (Das wäre äquivalent zu meinem Fall) – jandersson
dann haben Sie eine bedingte Beziehung, die in relationalen Datenbanken nicht wirklich gut behandelt wird. Eine Lösung sind zwei sich gegenseitig ausschließende Elternfelder, die sich gegenseitig ausschließen lassen. Eine andere Lösung sind zwei verschiedene Child-Tabellen, dito. Eine andere Lösung ist ein Feld, um Ihnen den Typ/Zustand zu sagen. Wenn eine untergeordnete Zeile zu beiden Eltern gehören kann, kann eine Brückentabelle sinnvoller sein. Ich würde vorschlagen, dass Sie zuerst die Semantik Ihres Entitätsmodells posten, da dies eine verdächtige Struktur ist ... –
@jandersson - In diesem Fall würden Sie eine zweite Fremdschlüsselbeziehung von Parent2 zu Child erstellen, indem Sie ein Parent2Id-Feld hinzufügen die Child-Tabelle. Steven's Ansatz ist klassisch 3NF und sollte für 99% aller Situationen verwendet werden. Der einzige Sinn des 1NF besteht darin, statische Datensätze für schnelle Lesevorgänge zu optimieren. –