Zusammengesetzte Primärschlüssel und Einfluss auf die Verwendung natürlicher / Ersatzschlüssel

8

Ich habe eine ziemlich einfache Frage über die Verwendung natürlicher / Ersatzschlüssel in einem gut definierten Kontext, der sich oft manifestiert und den ich illustrieren werde.

Nehmen wir an, Sie entwerfen das DB-Schema für ein Produkt mit SQL Server 2005 als DBMS. Der Einfachheit halber nehmen wir an, dass nur zwei Entitäten beteiligt sind, die auf zwei Tabellen, Master und Slave, abgebildet wurden. Angenommen, dass:

  1. Wir können 0..n Slave-Einträge für eine einzelne Master-Zeile haben;
  2. Spaltengruppe (A, B, C, D) im Master ist der einzige Kandidat für den Primärschlüssel;
  3. Die Spalte B im Master ist Änderungen unterworfen im Laufe der Zeit;
  4. A, B, C, D sind eine Mischung von Varchar-, Dezimal- und Bigint-Spalten.

Die Frage ist: Wie würden Sie Keys / Constraints / Referenzen für diese Tabellen entwerfen? Würdest du lieber ( argumentieren deine Wahl ):

  1. Implementieren Sie einen zusammengesetzten natürlichen Schlüssel auf Master (A, B, C, D) und einen verwandten zusammengesetzten Fremdschlüssel auf Slave oder
  2. Führen Sie einen Ersatzschlüssel K auf dem Master ein, sagen wir eine IDENTITY (1,1) Spalte mit einem verwandten (einspaltigen) Fremdschlüssel auf dem Slave und fügen Sie einen UNIQUE hinzu Einschränkung für Master (A, B, C, D) oder
  3. Verwenden Sie einen anderen Ansatz.

Was mich betrifft, würde ich mit Option 2 gehen, hauptsächlich wegen der Annahme 3) und der Leistung, aber ich würde gerne die Meinung anderer hören (da es eine offene Diskussion über das Thema gibt).

danke

    
Andrea Pigazzini 24.05.2011, 10:41
quelle

4 Antworten

5

Entweder 1,2 oder 3. Es gibt nicht unbedingt genügend Informationen, um zu bestimmen, ob ein Ersatz notwendig ist oder wie nützlich er sein könnte. Sind einige der zusammengesetzten Schlüsselattribute auch Teil eines Schlüssels oder einer Einschränkung in der Slave-Tabelle? Gibt es einen anderen Schlüssel des Meisters, der als Fremdschlüssel verwendet werden könnte? Die Tatsache, dass sich ein Schlüsselwert ändern kann, sollte nicht der entscheidende Faktor sein, da sich jeder Schlüsselwert ändern muss - Surrogate sind keine Ausnahme.

  

Es gibt eine ziemlich offene Debatte über die   Thema

Leider basiert ein Großteil dieser Debatte auf der irrigen Annahme, dass Sie zwischen einem Ersatz oder einem natürlichen Schlüssel wählen müssen. Wie Ihre Option 2 zu Recht vorschlägt, können Sie beide nach Bedarf verwenden. Das eine ist kein Ersatz für das andere, weil einfache Schlüssel und zusammengesetzte Schlüssel für verschiedene Attribute offensichtlich unterschiedliche Dinge in Ihrem Datenmodell bedeuten und unterschiedliche Einschränkungen für Ihre Daten erzwingen.

    
sqlvogel 24.05.2011, 12:02
quelle
8

Ich würde für Option 2 gehen. Halten Sie es einfach.

Er setzt die Kontrollkästchen (eng, numerisch, unveränderlich, streng monoton steigend) für einen nützlichen Clustered-Index (der Standard für PKs in SQL Server ist).

Sie müssen die Eindeutigkeit in A,B,C,D jedoch erzwingen, um die Datenintegrität zu erhalten, wie bereits erwähnt.

Mit Option 1 ist konzeptionell nichts falsch, aber sobald Sie mehr Indizes für "Master" benötigen, wird der breite Clusterschlüssel zu einer Verbindlichkeit. Oder mehr Arbeit, um festzustellen, welcher Index als Cluster am besten ist.

Bearbeiten:

Im Falle von Verwirrung

  

Die Auswahl, welcher Index gruppiert ist, ist getrennt von der Wahl des Schlüssels

    
gbn 24.05.2011 11:18
quelle
6

Ihre Annahme (3) neigt dazu, Option (2) vorzuschlagen, weil es unpraktisch und möglicherweise zeitaufwendig ist, mit kaskadierenden Aktualisierungen des Primärschlüssels des Masters umzugehen, wenn sich B ändert.

Natürlich hängt es davon ab, wie oft dies geschieht: wenn es etwas ist, von dem Sie erwarten, dass es "die ganze Zeit" passiert, dann ist es (A, B, C, D) eine schlechte Wahl des Primärschlüssels; Auf der anderen Seite, wenn es nur selten passiert, dann (A, B, C, D) kann eine gute Wahl der Primärschlüssel sein, und diese Spalten in Slave haben einige Vorteile (keine Notwendigkeit, mit dem Master alle zu verbinden Zeit, um diese Spaltenwerte herauszufinden).

    
Tony Andrews 24.05.2011 11:17
quelle
0

Drei.

Der erste Vorschlag könnte sein, kompostierte Schlüssel zu löschen und ein neues Feld für einen automatischen Schlüssel hinzuzufügen, das nicht mit den anderen Feldern zusammenhängt. Sowohl für die Master- als auch für die Detailtabelle.

Es könnte ein ganzzahliger Autoinkrement-Schlüssel oder ein Global Unique Identifier sein. Zusammengesetzte Schlüssel in jedem S.Q.L. Servermarke, ist schwierig und manchmal sehr schwierig.

Wenn Sie jedoch den zusammengesetzten Schlüssel in der Master-Tabelle behalten möchten, können Sie sich immer noch fragen, wie Sie mit dem Primärschlüssel der Slave-Tabelle umgehen. Viele Entwickler nehmen normalerweise die gleichen Felder für den Primärschlüssel aus der Haupttabelle, fügen sie in die Slave / Detail-Tabelle ein und fügen einen zusätzlichen fortlaufenden Integer-Schlüssel hinzu. Wenn Sie jedoch den Schlüssel für die Master-Tabelle ändern und die bereits vorhandenen Detailzeilen beibehalten möchten, stoßen Sie auf Probleme mit den Einschränkungen der referenziellen Integrität.

Zusammenfassung: Ich schlage vor, f \ u00fcr die Slave-Tabelle ein neues Feld einzuf \ u00fcgen, das nicht mit der Master-Tabelle verwandt ist, f \ u00fcr die Slave- / Detailtabelle einen Fremdschlüssel f \ u00fcr Felder hinzuf \ u00fcgt, der auf die Master-Tabelle verweist. Behalte den Detailprimärschlüssel und den Fremdschlüssel für die Master-Tabelle unabhängig.

    
umlcat 24.05.2011 14:23
quelle