Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entwerfen von 1:1- und 1:m-Beziehungen in SQL Server

Jede Beziehung erfordert, dass die "Eltern"-Tabelle (die eine Seite) einen Primärschlüssel (oder eindeutigen) Schlüssel (PK) hat, der jede Zeile eindeutig identifiziert, und die "Kind"-Tabelle (die andere Seite) eine oder mehrere Fremdschlüsselspalten hat , die mit Werten aufgefüllt werden muss, die mit einigen vorhandenen Werten des Primärschlüssels in der übergeordneten Tabelle identisch sind. Wenn Sie eine Eins-zu-Viele-Beziehung (1-M) wünschen, sollte der Fremdschlüssel ein gewöhnliches Attribut (Spalte oder Spalten) in der untergeordneten Tabelle sein, das sich wiederholen kann (es können viele Zeilen mit demselben Wert vorhanden sein)

Wenn Sie eine Eins-zu-eins-Beziehung (1-1) wünschen, sollte der Fremdschlüssel selbst ein Primärschlüssel oder ein eindeutiger Index in der untergeordneten Tabelle sein, der garantiert, dass es höchstens eine Zeile in der untergeordneten Tabelle mit diesem Wert geben kann.

Eine 1-1-Beziehung partitioniert effektiv die Attribute (Spalten) in einer Tabelle in zwei Tabellen. Dies wird als vertikale Segmentierung bezeichnet. Dies wird häufig für die Unterklassifizierung durchgeführt die Tabellenentitäten, oder aus einem anderen Grund, wenn die Verwendungsmuster für die Spalten in der Tabelle darauf hindeuten, dass auf einige der Spalten deutlich häufiger zugegriffen werden muss als auf die übrigen Spalten. (Angenommen, auf eine oder zwei Spalten wird 1000 Mal pro Sekunde zugegriffen, und auf die anderen 40 Spalten wird nur einmal im Monat zugegriffen). Die Partitionierung der Tabelle auf diese Weise optimiert effektiv das Speichermuster für diese beiden unterschiedlichen Abfragen.

Unterklassifizierung . Das Obige erstellt tatsächlich eine 1-zu-Null- oder Eins-Beziehung, die für eine sogenannte Unterklassen- oder Untertypbeziehung verwendet wird. Dies tritt auf, wenn Sie zwei verschiedene Entitäten haben, die eine große Anzahl von Attributen teilen, aber eine der Entitäten zusätzliche Attribute hat, die die andere nicht benötigt. Ein gutes Beispiel könnte Mitarbeiter sein , und Angestellte . Der Mitarbeiter Die Tabelle hätte alle Attribute, die alle Mitarbeiter gemeinsam haben, und den SalariedEmployee würde in einer (1-0/1)-Beziehung mit Employees existieren, mit den zusätzlichen Attributen (Gehalt , Jahresurlaub , etc.), die nur Angestellte benötigen.

Wenn Sie wirklich eine 1-1-Beziehung wünschen, müssen Sie einen weiteren Mechanismus hinzufügen, um sicherzustellen, dass die untergeordnete Tabelle immer einen Datensatz für jeden Datensatz/jede Zeile in der übergeordneten Tabelle enthält. Im Allgemeinen besteht die einzige Möglichkeit dazu darin, dies in dem Code zu erzwingen, der zum Einfügen von Daten verwendet wird (entweder in einem Trigger, einer gespeicherten Prozedur oder einem Code außerhalb der Datenbank). Dies liegt daran, dass, wenn Sie referenzielle Integritätsbedingungen für zwei Tabellen hinzufügen, die erfordern, dass Zeilen immer in beiden enthalten sind, es nicht möglich wäre, einer der beiden Tabellen eine Zeile hinzuzufügen, ohne eine der Einschränkungen zu verletzen, und Sie können nicht beiden Tabellen eine Zeile hinzufügen Tische gleichzeitig.