Ist es jemals sinnvoll, keine Eins-zu-Eins-Beziehungen zu schließen?

12

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.)?

Der 29. Salzstreuer
quelle
5
Meinen Sie 1-zu-1 oder 1-zu-0-oder-1?
jpmc26

Antworten:

30

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 UserTabelle und dann eine AdministratorTabelle 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 der AdministratorTabelle. Sie benötigen etwas Ähnliches, wenn Sie einen Workflow unterstützen, z. B. eine ScheduledTaskTabelle und eine CompletedTaskTabelle.

Möglicherweise möchten Sie eine kompakte Tabelle für häufig verwendete Daten Userund dann eine größere Tabelle für Details, die Sie nicht oft benötigen UserDetails. 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. UserundUserCredentials

Möglicherweise möchten Sie unterschiedliche Sicherungsstrategien und platzieren daher zwei Tabellen auf unterschiedlichen Partitionen, z. B. TransactionundTransactionArchive

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

John Wu
quelle
Wenn Ihre Tabelle mehr Spalten enthält, als vom Datenbanksystem unterstützt werden können, liegt ein Entwurfsproblem vor. Aber sonst ist Ihre Antwort gesund.
Robert Harvey
2
Einverstanden ... Ich versuche, eine vollständige Liste zu erstellen, die nicht aus jedem Grund redaktionell bearbeitet wird.
John Wu
Was ist Ihr Hintergrund in Workflows? Haben Sie spezielle Software, die Sie verwenden? Haben Sie Ihr eigenes Workflow-System implementiert?
Robert Harvey
1
Physisch = Hat mit physischen Einschränkungen wie Serverleistung, Seitengröße, Indizierung, Clustering, Backups usw. zu tun. Keine dieser Einschränkungen sollte das logische Design beeinflussen. Aus rein logischer Sicht sollte eine einzelne Entität als ein einzelnes Tupel oder eine einzelne Zeile in einer einzelnen Tabelle konzipiert werden.
John Wu
4
Link „Eine Eins-zu-Eins - Beziehung in einer relationalen Datenbank tritt auf, wenn ein Elternteil Datensatz oder Feld hat entweder null oder ein einziges Kind Rekord.“
John Wu
6

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.

Tulains Córdova
quelle
3

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:

type Transaction(The_Type: PaymentType := Cash) is record

    Amount: Integer;

    case The_Type is
        when Cash =>
            Discount: boolean;
        when Check =>
            CheckNumber: Positive;
        when Credit =>
            CardNumber: String(1..5);
            Expiration: String(1..5);
    end case;
end record;
Robert Harvey
quelle
Wenn es optional ist, wie unterscheidet sich dies davon, dass sich alles in einer Tabelle befindet und nur die gewünschten Spalten ausgewählt werden?
Der 29. Salzstreuer
Sie tragen die Kosten dafür, diese zusätzlichen Felder in der Haupttabelle zu haben, auch wenn sie nichts enthalten. Wenn Ihr Variantendatensatz mehrere Tabellen enthält, enthält eine einzelne Tabelle möglicherweise 100 Spalten, von denen die meisten die meiste Zeit nicht verwendet werden.
Robert Harvey
1

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.

Doc Brown
quelle
Können Sie ein konkretes Beispiel dafür geben, was Sie meinen?
Der 29. Salzstreuer