Ich möchte wissen, ob zusammengesetzte Primärschlüssel eine schlechte Praxis sind und wenn nicht, in welchen Szenarien die Verwendung empfohlen wird.
Meine Frage basiert auf diesem Artikel
Der Teil über zusammengesetzte Primärschlüssel:
Schlechte Praxis Nr. 6: Zusammengesetzte Primärschlüssel
Dies ist eine Art kontroverser Punkt, da viele Datenbankdesigner heutzutage davon sprechen, ein automatisch generiertes Feld mit ganzzahliger ID als Primärschlüssel anstelle eines zusammengesetzten Felds zu verwenden, das durch die Kombination von zwei oder mehr Feldern definiert wird. Dies wird derzeit als „Best Practice“ definiert, und ich persönlich stimme dem eher zu.
Dies ist jedoch nur eine Konvention, und natürlich ermöglichen DBEs die Definition von zusammengesetzten Primärschlüsseln, die viele Designer für unvermeidlich halten. Daher sind zusammengesetzte Primärschlüssel wie bei der Redundanz eine Entwurfsentscheidung.
Beachten Sie jedoch, dass der Index, der den zusammengesetzten Schlüssel steuert, bis zu einem Punkt anwachsen kann, an dem die Leistung der CRUD-Operation stark beeinträchtigt ist, wenn für Ihre Tabelle mit einem zusammengesetzten Primärschlüssel Millionen von Zeilen erwartet werden. In diesem Fall ist es viel besser, einen einfachen Primärschlüssel mit ganzzahliger ID zu verwenden, dessen Index kompakt genug ist, und die erforderlichen DBE-Einschränkungen festzulegen, um die Eindeutigkeit aufrechtzuerhalten.
quelle
Antworten:
Zu sagen, dass die Verwendung von
"Composite keys as PRIMARY KEY is bad practice"
völlig Unsinn ist!Verbundwerkstoffe
PRIMARY KEY
sind oft eine sehr "gute Sache" und die einzige Möglichkeit, natürliche Situationen im Alltag zu modellieren!Denken Sie an das klassische Lehrbeispiel Databases-101 für Studenten und Kurse und an die vielen Kurse, die von vielen Studenten besucht werden!
Erstellen Sie Tabellen Kurs und Schüler:
Ich gebe Ihnen das Beispiel im PostgreSQL-Dialekt (und MySQL ) - sollte für jeden Server mit ein wenig Optimierung funktionieren.
Jetzt wollen Sie natürlich den Überblick behalten , von denen Schüler nehmen , welcher Kurs - so haben Sie , was eine genannt wird
joining table
(auch genanntlinking
,many-to-many
oderm-to-n
Tabellen). Sie sind auch alsassociative entities
eher im Fachjargon bekannt!1 Kurs kann viele Studenten haben.
1 Student kann viele Kurse belegen.
Sie erstellen also eine Verbindungstabelle
Die einzige Möglichkeit, diesem Tisch eine sinnvolle Note zu geben,
PRIMARY KEY
besteht darin,KEY
eine Kombination aus Kurs und Schüler zu erstellen. Auf diese Weise können Sie nicht bekommen:ein Duplikat der Kombination aus Student und Kurs
In einem Kurs kann derselbe Student nur einmal eingeschrieben sein
Ein Student kann sich nur einmal für denselben Kurs anmelden
Sie haben auch eine fertige Suche
KEY
nach Kurs pro Schüler - AKA ein Deckungsindex ,Es ist trivial, Kurse ohne Studenten und Studenten zu finden, die keine Kurse belegen!
- Das db-Geige Beispiel hat die PK Einschränkung in die CREATE TABLE gefaltet - Es kann so oder so durchgeführt werden. Ich bevorzuge es, alles in der Anweisung CREATE TABLE zu haben.
Wenn Sie feststellen, dass die Suche nach Schülern nach Kurs langsam war, können Sie ein
UNIQUE INDEX
on (sc_student_id, sc_course_id) verwenden.Es gibt kein Allheilmittel Indizes für das Hinzufügen - sie werden machen
INSERT
s undUPDATE
s langsamer, aber im großen Vorteil enorm abnimmtSELECT
Zeiten! Es ist in den Entwickler bis zu indizieren ihre Kenntnisse und Erfahrungen gegeben , um zu entscheiden, aber zu sagen , dass VerbundPRIMARY KEY
s sind immer schlecht ist schlicht und einfach falsch.Beim Verbinden von Tabellen sind sie normalerweise die einzigen
PRIMARY KEY
, die Sinn machen! Das Verbinden von Tabellen ist auch sehr häufig die einzige Möglichkeit zu modellieren, was in der Wirtschaft oder in der Natur oder in praktisch jeder Sphäre passiert, die mir einfällt!Diese PK ist auch nützlich,
covering index
um die Suche zu beschleunigen. In diesem Fall wäre es besonders nützlich, wenn man regelmäßig nach (course_id, student_id) sucht, was, wie man sich vorstellen kann, oft der Fall sein kann!Dies ist nur ein kleines Beispiel dafür, wo ein Komposit
PRIMARY KEY
eine sehr gute Idee sein kann und der einzig vernünftige Weg, die Realität zu modellieren! Auf den ersten Blick fällt mir noch viel mehr ein.Ein Beispiel aus meiner eigenen Arbeit!
Betrachten Sie eine Flugtabelle mit einer Flug-ID, einer Liste der Abflug- und Ankunftsflughäfen und den relevanten Zeiten sowie eine Cabin_crew-Tabelle mit Besatzungsmitgliedern!
Die einzig vernünftige Möglichkeit, dies zu modellieren, besteht darin, eine Flight_Crew-Tabelle mit der Flight_ID und der Crew_ID als Attribut zu haben. Die einzig vernünftige Möglichkeit
PRIMARY KEY
besteht darin, den zusammengesetzten Schlüssel der beiden Felder zu verwenden!quelle
id
Primärschlüssel und einen eindeutigen Index hatcs_student_id
cs_course_id
und dieselben Ergebnisse erzielt.Meine halbherzige Einstellung: Ein "Primärschlüssel" muss nicht der einzige eindeutige Schlüssel sein, der zum Nachschlagen von Daten in der Tabelle verwendet wird, obwohl Datenverwaltungstools ihn als Standardauswahl anbieten. Wenn Sie also auswählen möchten, ob eine Zusammensetzung aus zwei Spalten oder eine zufällig (wahrscheinlich seriell) generierte Nummer als Tabellenschlüssel verwendet werden soll, können Sie zwei verschiedene Schlüssel gleichzeitig verwenden.
Wenn Datenwerte einen geeigneten eindeutigen Begriff enthalten, der die Zeile darstellen kann, würde ich diesen lieber als "Primärschlüssel" deklarieren, auch wenn er zusammengesetzt ist, als einen "synthetischen" Schlüssel zu verwenden. Der synthetische Schlüssel kann aus technischen Gründen eine bessere Leistung erbringen, aber meine eigene Standardauswahl besteht darin, den realen Begriff als Primärschlüssel zu bestimmen und zu verwenden, es sei denn, Sie müssen wirklich den anderen Weg gehen, damit Ihr Service funktioniert.
Ein Microsoft SQL Server verfügt über die eindeutige, aber verwandte Funktion des "Clustered Index", der die physische Speicherung von Daten in Indexreihenfolge steuert und auch in anderen Indizes verwendet wird. Standardmäßig wird ein Primärschlüssel als Clustered-Index erstellt. Sie können jedoch stattdessen Nicht-Clustered auswählen, vorzugsweise nach dem Erstellen des Clustered-Index. Sie können also eine Spalte mit Ganzzahlidentität als Clustered-Index und beispielsweise den Dateinamen nvarchar (128 Zeichen) als Primärschlüssel erstellen. Dies ist möglicherweise besser, da der Clustered-Indexschlüssel eng ist, auch wenn Sie den Dateinamen als Fremdschlüsselbegriff in anderen Tabellen speichern - obwohl dieses Beispiel ein guter Fall ist, um dies auch nicht zu tun.
Wenn Ihr Entwurf das Importieren von Datentabellen umfasst, die einen unbequemen Primärschlüssel zum Identifizieren verwandter Daten enthalten, bleiben Sie ziemlich fest.
https://www.techopedia.com/definition/5547/primary-key beschreibt ein Beispiel für die Auswahl, ob Daten mit der Sozialversicherungsnummer eines Kunden als Kundenschlüssel in allen Datentabellen gespeichert oder eine beliebige Kunden-ID generiert werden sollen registriere sie. Tatsächlich ist dies ein schwerwiegender Missbrauch von SSN, abgesehen davon, ob es funktioniert oder nicht. Es ist ein persönlicher und vertraulicher Datenwert.
Ein Vorteil der Verwendung einer realen Tatsache als Schlüssel besteht darin, dass Sie ohne erneutes Verknüpfen mit der Tabelle "Kunde" Informationen darüber in anderen Tabellen abrufen können - dies ist jedoch auch ein Problem der Datensicherheit.
Außerdem sind Sie in Schwierigkeiten, wenn die SSN oder ein anderer Datenschlüssel falsch aufgezeichnet wurde, sodass Sie den falschen Wert in 20 eingeschränkten Tabellen anstatt nur in "Kunde" haben. Während die synthetische customer_id keine externe Bedeutung hat, kann es sich nicht um einen falschen Wert handeln.
quelle