Wenn wir Tabelle A haben, die eine Eins-zu-Eins-Beziehung zu Tabelle B hat, macht es jemals Sinn, sie getrennt zu halten? Oder tut es nie weh, sie zu einem einzigen Tisch zusammenzufassen? Beeinflusst eines dieser Szenarien (zwei Tabellen gegen eine kombinierte Tabelle) die normale Form (1NF, 2NF, 3NF usw.)?
database
relational-database
normalization
Der 29. Salzstreuer
quelle
quelle
Antworten:
Ja, es gibt unzählige Gründe, warum dies das bessere Design sein könnte.
Möglicherweise haben Sie eine Vererbungs- / Erweiterungsbeziehung, z. B. eine
User
Tabelle und dann eineAdministrator
Tabelle mit mehr Feldern. Beide Tabellen haben möglicherweise einen Primärschlüssel der Benutzer-ID (und daher eine 1: 1-Beziehung), aber nicht alle Benutzer haben einen Datensatz in derAdministrator
Tabelle. Sie benötigen etwas Ähnliches, wenn Sie einen Workflow unterstützen, z. B. eineScheduledTask
Tabelle und eineCompletedTask
Tabelle.Möglicherweise möchten Sie eine kompakte Tabelle für häufig verwendete Daten
User
und dann eine größere Tabelle für Details, die Sie nicht oft benötigenUserDetails
. Dies kann die Leistung verbessern, da Sie mehr Datensätze in eine einzelne Datenseite einfügen können.Möglicherweise möchten Sie unterschiedliche Berechtigungen für die Tabellen, z. B.
User
undUserCredentials
Möglicherweise möchten Sie unterschiedliche Sicherungsstrategien und platzieren daher zwei Tabellen auf unterschiedlichen Partitionen, z. B.
Transaction
undTransactionArchive
Möglicherweise benötigen Sie mehr Spalten, als in einer einzelnen Tabelle unterstützt werden können, z. B. wenn viele große Textspalten indiziert werden müssen und Ihre DB-Plattform auf 4-KB-Datenseiten beschränkt ist oder wenn Sie
quelle
Ein weiterer Grund für die hervorragende Antwort von @ john-wu ist, dass Sie eine Spalte vom Typ BLOB wie ein Bild haben.
Sie möchten diese BLOB-Spalte in einer separaten Tabelle haben, nicht nur, weil Abfragen in der Benutzertabelle schneller sind, sondern auch, weil Sie die Tabelle mit dem Blob in einen anderen Tablespace in einem günstigeren, langsameren Speicher verschieben und die am häufigsten abgefragten Daten in der Tabelle behalten können Haupttabellenbereich auf einem schnelleren Speicher.
quelle
Eins-zu-eins-Beziehungen sind nur dann wirklich sinnvoll, wenn der zugehörige Datensatz in Tabelle B optional sein soll.
Manchmal möchten Sie einen Variantendatensatz oder eine Tagged Union . Das heißt, Sie haben mehrere Tabellen mit unterschiedlichen Informationen, die sich jedoch alle in einer Eins-zu-Eins-Beziehung auf Tabelle A beziehen. Sie wählen dann die zuzuordnende Tabelle basierend auf einem Feld in Tabelle A aus
Beispielsweise:
quelle
Bei der Geschäftsmodellierung werden zwei Entitäten A und B, die aus geschäftlicher Sicht logisch getrennt sind, in der Regel unterschiedlichen Tabellen zugeordnet.
Wenn Sie beispielsweise Geschäftsmodelle mit objektorientierten Mitteln erstellen, verfügen Sie normalerweise über eine Art objektrelationale Zuordnung. Sie können mit einem Objektmodell beginnen und daraus Ihr relationales Modell ableiten. Stellen Sie sich vor, Sie haben in Ihrem Objektmodell die Klassen A und B erstellt, die, obwohl die Objekte eine 1: 1-Entsprechung haben, aufgrund des Prinzips der Einzelverantwortung getrennt bleiben sollten . Beachten Sie, dass es sich bei diesen Klassen in Ihrem Objektmodell nicht nur um Tabellen mit Attributen handelt, sondern dass sie möglicherweise Geschäftsobjekte darstellen, wobei einige Verhaltensweisen in Methoden implementiert sind. Wenn Sie diese Klassen jetzt direkt einem relationalen Modell zuordnen, erhalten Sie separate Tabellen A und B mit einer 1: 1-Beziehung.
Nach meiner Erfahrung ist diese logische Trennung beim Erstellen eines Geschäfts- oder OO-Datenmodells für 1: 1-Beziehungen weitaus typischer als "physikalische" Gründe wie Leistung, individuelle Sicherheit oder Partitionierung.
quelle