2009-02-05 7 views
21

Eine DB-Designfrage: Wann entscheiden Sie sich, 1 zu 1 Relationstabellen zu verwenden?Wann sollten 1-zu-1-Beziehungen zwischen Datenbanktabellen verwendet werden?

Eine der Stellen, die ich sehe, ist beispielsweise, wenn Sie eine User- und UserProfile-Tabelle haben, teilen sie die Leute, anstatt alle Spalten nur in eine User-Tabelle zu setzen.

Technisch können Sie einfach alle Spalten in eine Tabelle setzen, da ihre Beziehung 1 zu 1 ist.

Ich weiß, jemand sagte, dass für die UserProfile-Tabelle im Laufe der Zeit Tabelle ändern müssen, um weitere Spalten hinzuzufügen, aber ich glaube wirklich nicht, dass dies ein starker Grund ist, die Tabellen zu teilen.

Also, wenn ich eine User-Tabelle und UserProfile-Tabelle zu entwerfen, ist es besser für mich, es nur in einer Tabelle zu tun?

+0

Mögliche Duplikate von [Gibt es jemals eine Zeit, in der die Verwendung einer Datenbank-1: 1-Beziehung sinnvoll ist?] (Http://stackoverflow.com/questions/517417/is-there-ever-a-time-where-using) -a-Datenbank-11-Beziehung-macht-Sinn) – Tripartio

Antwort

16

Die einzige Zeit, die ich eine 1 zu 1 Beziehung verwendet habe, ist, wenn ich möchte, dass sie polymorph zu mehreren Objekten gehört.

Wie eine Adresse zum Beispiel. Ein Benutzer hat eine Adresse, ein Unternehmen hat eine Adresse, ein Featured Restaurant hat eine Adresse. Alle Instanzen werden in derselben Tabelle behandelt und haben denselben Code, der sie steuert. Stellen Sie sich das Refactoring Ihres Datenmodells so vor, dass Sie es an anderen Orten wiederverwenden können.

5

Nur wenn die Felder in der UserProfile-Tabelle nicht für alle Datensätze in der Benutzertabelle erforderlich sind. Wenn Sie zum Beispiel 3.000.000 Benutzer haben, aber nur 3.000 davon UserProfiles, kann es sinnvoll sein, sie zu teilen (um eine ganze Reihe von Nullspalten zu vermeiden).

Obwohl jetzt ein Tag mit der erhöhten Datenbankgeschwindigkeit und den günstigen Kosten von Speicher, es macht wirklich keinen großen Unterschied, sie aus diesem Grund zu spalten ...

10

Denken Sie darüber nach, wie Sie die Geschäftsobjekte entwerfen würden. Haben Sie ein Benutzerobjekt mit 50 Eigenschaften, oder haben Sie ein Benutzerobjekt mit ein paar Detaileigenschaften und dann ein Profilobjekt, das andere Daten für ein Profil enthält?

Sie sollten 1-zu-1 verwenden, wenn die Daten in der Tabelle verwandt sind, aber nicht für den gleichen Zweck da sind. (wahrscheinlich könnte besser formuliert werden)

Auch es kann die Dinge einfacher zu finden. Nicht viele Dinge, die ich hasse mehr als durch einen Tisch mit 75 Spalten zu sehen.

2

Ich habe kürzlich gesehen, wo Sie eine Tabelle hatten, mit den meisten Daten in, dann eine andere Tabelle mit vielen und vielen optionalen Daten.

Die zweite Tabelle hatte ein Drittel der Zeilen, aber dreimal so viele Spalten.

Dies wurde vor ein paar Jahren getan vermeiden viele Null in Spalten - d. H. Leeren Raum.

Wenn Sie dies jetzt tun, würde ich versucht, nicht zu stören. Lebe mit dem leeren Raum. Der Aufwand, den es für die Anwendungsentwicklung verursachen kann, ist es einfach nicht wert und Platz ist billiger als Entwicklungszeit.

9

Der klassische Grund ist die Vermeidung von Nullable-Spalten.

Wenn Sie in einer Spalte einen NULL-Wert haben, kann es schwieriger sein, klares (wartbares) SQL zu schreiben. @Ovid hat darüber here geschrieben, auf der Arbeit von Chris Date.

+0

+1 Gute Antwort. Aus Sicht des Anwendungsentwicklers wäre ich immer noch versucht, mit den Nullen zu leben und ein gutes ORM wie NHibernate zu verwenden. –

3

Dies ist eine direkte Kopie und einfügen aus einer anderen Frage, die heute in diesem Thread aufgetaucht ist, aber es fühlt sich auch hier nützlich an. Is there ever a time where using a database 1:1 relationship makes sense?

Ich benutze sie hauptsächlich aus ein paar Gründen. Eine davon ist eine signifikante Änderung der Datenänderungsrate. Einige meiner Tabellen haben möglicherweise Audit-Trails, in denen ich frühere Versionen von Datensätzen verfolge, wenn ich nur vorherige Versionen von 5 von 10 Spalten verfolgen möchte, die diese 5 Spalten in eine separate Tabelle aufteilen, wobei ein Audit-Trail-Mechanismus effizienter ist. Außerdem kann ich Aufzeichnungen haben (sagen wir für eine Buchhaltungs-App), die nur schreiben. Sie können die Dollarbeträge oder das Konto, für das sie erstellt wurden, nicht ändern. Wenn Sie einen Fehler gemacht haben, müssen Sie einen entsprechenden Datensatz erstellen, um den falschen Datensatz anzupassen, und dann einen Korrektureintrag erstellen. Ich habe Beschränkungen für die Tabelle, die die Tatsache durchsetzt, dass sie nicht aktualisiert oder gelöscht werden können, aber ich kann ein paar Attribute für das Objekt haben, die formbar sind, die in einer separaten Tabelle ohne die Einschränkung der Modifikation gehalten werden. Ein anderes Mal mache ich das in Krankenakten. Es gibt Daten, die sich auf einen Besuch beziehen, der nach der Abmeldung nicht geändert werden kann, und andere Daten, die sich auf einen Besuch beziehen, der nach der Abmeldung geändert werden kann. In diesem Fall werde ich die Daten teilen und einen Trigger auf die gesperrte Tabelle setzen, der die Aktualisierungen der gesperrten Tabelle ablehnt, wenn ich mich abgemeldet habe, aber Aktualisierungen der Daten erlauben, die der Arzt nicht abmeldet.

Ein anderes Plakat kommentierte auf 1: 1, das nicht normalisiert wird, würde ich in einigen Situationen, insbesondere subtyping dem widersprechen. Angenommen, ich habe eine Angestelltentabelle und der Primärschlüssel ist ihre SSN (es ist ein Beispiel, lass uns die Debatte speichern, ob das ein guter Schlüssel ist oder nicht für einen anderen Thread). Die Mitarbeiter können unterschiedlicher Art sein, zum Beispiel vorübergehend oder dauerhaft, und wenn sie dauerhaft sind, müssen sie mehr Felder ausfüllen, z. B. eine Bürotelefonnummer, die nur nicht null sein sollte, wenn der Typ = "Permanent" ist. In einer dritten Normalform-Datenbank sollte die Spalte nur vom Schlüssel abhängen, dh vom Angestellten, aber sie hängt tatsächlich vom Angestellten und vom Typ ab, so dass eine 1: 1 Beziehung vollkommen normal und in diesem Fall wünschenswert ist. Es verhindert auch übermäßig dünne Tabellen, wenn ich 10 Spalten habe, die normalerweise gefüllt sind, aber 20 zusätzliche Spalten nur für bestimmte Typen.

0

Ich denke, Shane D hat einen recht gültigen Grund. Da sogar die gleiche Situation für eine Tabelle mit etwa 40 Spalten auftrat, werden die Daten für diese Spalten über CSVs hochgeladen und nur für Berichtszwecke und eine Reihe von Spalten verwendet, um diese Dateien zu verarbeiten, die häufig aktualisiert werden.

Also wenn wir eine Tabelle als eine Lösung pflegen. Wir führen häufige Aktualisierungen für diese Tabelle durch und werden nur 5 Spalten von 50 aktualisieren. Ich denke, jede Aktualisierung stört die Zeilenzuordnung und es besteht eine hohe Wahrscheinlichkeit für Zeilenverkettung. Um Zeilenkettungen zu vermeiden, folgte ich dem Ansatz der Datentrennung basierend auf DML-Aktivität.

mich, wenn jeder bessere Lösung kennen Lassen

1

Dieses gut behandelt wurde, aber ich werde nur eine kurze Notiz hinzufügen, etwas zu klären, die nicht mir klar war und wurde nicht ausdrücklich anders erwähnt. Eine 1: 1-Beziehung bedeutet nicht, dass für jeden Datensatz in Tabelle A 1 entsprechender Datensatz in Tabelle B vorhanden ist. Stattdessen bedeutet dies, dass für jeden Datensatz in Tabelle A 0 oder 1 entsprechende Datensätze in Tabelle B vorhanden sind.

Shane D. und andere beschreiben Szenarien, die diese Tatsache nutzen.