Warum mehrere Spalten als Primärschlüssel verwenden (zusammengesetzter Primärschlüssel)

109

Dieses Beispiel stammt aus w3schools .

CREATE TABLE Persons
(
    P_Id int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)

Nach meinem Verständnis stellen beide Spalten zusammen ( P_Idund LastName) einen Primärschlüssel für die Tabelle dar Persons. Ist das richtig?

  • Warum sollte jemand mehrere Spalten als Primärschlüssel anstelle einer einzelnen Spalte verwenden wollen?
  • Wie viele Spalten können zusammen als Primärschlüssel in einer bestimmten Tabelle verwendet werden?
Rockbala
quelle
... jetzt gibt es auch eine Antwort auf die 2. Frage
Wolf
1
@ Martinij Peters. Warum wurde die Antwort gelöscht?
PerformanceDBA

Antworten:

119

Dein Verständnis ist korrekt.

Sie würden dies in vielen Fällen tun. Ein Beispiel ist in einer Beziehung wie OrderHeaderund OrderDetail. Die PK in OrderHeaderkönnte sein OrderNumber. Die PK in OrderDetailkönnte OrderNumberUND sein LineNumber. Wenn es eines dieser beiden wäre, wäre es nicht eindeutig, aber die Kombination der beiden ist garantiert einzigartig.

Die Alternative besteht beispielsweise in diesem Fall in der Verwendung eines generierten (nicht intelligenten) Primärschlüssels OrderDetailId. Aber dann würde man die Beziehung nicht immer so leicht sehen. Einige Leute bevorzugen einen Weg; manche bevorzugen den anderen Weg.

MJB
quelle
2
Ist dies nützlich, wenn ich branch_id verwende und die Replikation zwischen zwei Datenbanken verwende, um doppelte IDs zu lösen? !!
Mhmd
11
Beachten Sie, dass Sie in vielen Fällen, in denen ein generierter Primärschlüssel verwendet wird, häufig immer noch einen eindeutigen Schlüssel für die zusammengesetzten Werte wünschen.
Bacon Bits
Bitte erläutern Sie "Einige Leute bevorzugen einen Weg, andere den anderen".
Benutzername
1
Klagegründe ausarbeiten? Ich weiß nicht, was ich sagen soll. Ich habe Leute gekannt, die es vorziehen, mehrere verkettete Felder als Schlüssel zu haben, weil es intuitiv einfacher ist, zu verstehen, was sie betrachten. Ich habe andere gekannt, die es vorziehen, jeder Zeile nur einen eindeutigen Schlüssel zuzuweisen, da die Eingabe einfacher und schneller ist. Fragen Sie das?
MJB
Diese Nachricht war für @Username gedacht. Ich habe vergessen, Regie zu führen.
MJB
26

Ein weiteres Beispiel für zusammengesetzte Primärschlüssel ist die Verwendung von Zuordnungstabellen. Angenommen, Sie haben eine Personentabelle, die eine Gruppe von Personen enthält, und eine Gruppentabelle, die eine Gruppe von Gruppen enthält. Jetzt möchten Sie eine Beziehung von vielen zu vielen Personen und Gruppen herstellen. Das heißt, jede Person kann vielen Gruppen angehören. So würde die Tabellenstruktur mit einem zusammengesetzten Primärschlüssel aussehen.

Create Table Person(
PersonID int Not Null,
FirstName varchar(50),
LastName varchar(50),
Constraint PK_Person PRIMARY KEY (PersonID))

Create Table Group (
GroupId int Not Null,
GroupName varchar(50),
Constraint PK_Group PRIMARY KEY (GroupId))

Create Table GroupMember (
GroupId int Not Null,
PersonId int Not Null,
CONSTRAINT FK_GroupMember_Group FOREIGN KEY (GroupId) References Group(GroupId),
CONSTRAINT FK_GroupMember_Person FOREIGN KEY (PersonId) References Person(PersonId),
CONSTRAINT PK_GroupMember PRIMARY KEY (GroupId, PersonID))
John Hartsock
quelle
gute Erklärung: Ich denke, die Notwendigkeit von Attributen für m-zu-n-Beziehungen (in einer normalisierten Fasion) ist der Schlüssel.
Wolf
Vielleicht wäre eine kleine Erklärung des Nutzens sogar noch besser
Martian2049
10

Das W3Schools-Beispiel sagt nicht aus, wann Sie zusammengesetzte Primärschlüssel verwenden sollen, und gibt nur eine Beispielsyntax an, die dieselbe Beispieltabelle wie für andere Schlüssel verwendet.

Ihre Wahl des Beispiels führt Sie möglicherweise irre, indem Sie einen bedeutungslosen Schlüssel (P_Id) und einen natürlichen Schlüssel (Nachname) kombinieren. Diese seltsame Auswahl des Primärschlüssels besagt, dass die folgenden Zeilen gemäß dem Schema gültig sind und erforderlich sind, um einen Schüler eindeutig zu identifizieren. Intuitiv macht das keinen Sinn.

1234     Jobs
1234     Gates

Weiterführende Literatur : Die große Primärschlüsseldebatte oder einfach nur Google meaningless primary keysoder sogar diese SO-Frage lesen

FWIW - Meine 2 Cent dienen dazu, mehrspaltige Primärschlüssel zu vermeiden und ein einzelnes generiertes ID-Feld (Ersatzschlüssel) als Primärschlüssel zu verwenden und bei Bedarf zusätzliche (eindeutige) Einschränkungen hinzuzufügen.

Robert Paulson
quelle
1
1) Der Link "Große Primärschlüsseldebatte" ist besonders dumm, die Informationen sind eigennützig und falsch. 2) Der Index der Spalten, die die Zeile eindeutig machen, kann nicht vermieden werden. Eine "Ersatz" -ID mit einem Index ist immer eine zusätzliche Spalte und ein zusätzlicher Index. Eher albern, weil es überflüssig ist. Und langsamer.
PerformanceDBA
2
Die "große Primärschlüsseldebatte" ist nicht dumm. Es ist ein sehr gültiges Problem von Entwicklern, die keine SQL-Entwickler oder SQL-Datenbankadministratoren sind und nicht ihre ganze Zeit in SQL verbringen. Selbst in reinem SQL hätte ich lieber einen bedeutungslosen automatisch generierten Schlüssel als Primärschlüssel beim Beitritt, als daran denken zu müssen, n Datenbits als natürlichen Schlüssel weiterzugeben. Sie sind zu Ihrem Standpunkt willkommen, aber wir würden uns freuen, nicht so abweisend zu sein.
Robert Paulson
4

Sie verwenden einen zusammengesetzten Schlüssel (einen Schlüssel mit mehr als einem Attribut), wenn Sie die Eindeutigkeit einer Kombination mehrerer Attribute sicherstellen möchten. Ein einzelner Attributschlüssel würde nicht dasselbe erreichen.

nvogel
quelle
1
Um einen eindeutigen Schlüssel sicherzustellen, können Sie sich auf die Kombination zweier Attribute verlassen, um einen Schlüssel zu bilden, der logischerweise nicht dupliziert werden kann. Person und Abschlussdatum aus einem größeren Datensatz wären ein Beispiel.
John Mark
3

Ja, beide bilden den Primärschlüssel. Vor allem in Tabellen , in denen Sie nicht über einen Ersatzschlüssel , kann es notwendig sein, mehrere Attribute als eindeutige Kennung für jeden Datensatz (schlechtes Beispiel zu geben: eine Tabelle mit sowohl einem Vornamen und Nachnamen könnte die Kombination von ihnen verlangen , um einzigartig).

ig0774
quelle
3

Mehrere Spalten in einem Schlüssel weisen im Allgemeinen eine schlechtere Leistung auf als ein Ersatzschlüssel. Ich bevorzuge einen Ersatzschlüssel und dann einen eindeutigen Index für einen mehrspaltigen Schlüssel. Auf diese Weise können Sie eine bessere Leistung erzielen und die erforderliche Einzigartigkeit bleibt erhalten. Und noch besser: Wenn sich einer der Werte in diesem Schlüssel ändert, müssen Sie nicht auch eine Million untergeordneter Einträge in 215 untergeordneten Tabellen aktualisieren.

HLGEM
quelle
1
1) Leistung. Nicht in einer SQL-Plattform (möglicherweise in den vorgetäuschten "SQL" und Freeware). 2) Präferenz ist irrelevant. Was die Tabellen für die Integrität erfordern, ist relevant. 3) Eine "Ersatz" -ID mit einem Index ist immer eine zusätzliche Spalte und ein zusätzlicher Index. Das wäre also auf jeder Plattform langsamer. Bezüglich der Leistung widersprechen Sie sich. 4) Wenn Sie nicht wissen, wie Sie die mythischen "Millionen untergeordneten Einträge in 215 untergeordneten Tabellen" richtig aktualisieren können , stellen Sie eine Frage.
PerformanceDBA
2
Ich bin mit der Aussage nicht einverstanden, dass mehrere Spalten in einem Schlüssel im Allgemeinen schlechter abschneiden als ein Ersatzschlüssel. Oft ist eine zusätzliche Abfrage erforderlich, um den Ersatzschlüssel einer Beziehung zu erhalten, wenn Sie dies berücksichtigen. Ab diesem Zeitpunkt ist es eine volle zusätzliche Hin- und Rückfahrt, die in Bezug auf die Leistung langsamer ist.
ttugates
3

Deine zweite Frage

Wie viele Spalten können zusammen als Primärschlüssel in einer bestimmten Tabelle verwendet werden?

ist implementierungsspezifisch: Es wird im tatsächlich verwendeten DBMS definiert. [1], [2], [3] Sie müssen die technischen Spezifikationen des von Ihnen verwendeten Datenbanksystems überprüfen. Einige sind sehr detailliert, andere nicht. Das Durchsuchen des Webs nach solchen Einschränkungen kann schwierig sein, da die Terminologie variiert. Der Begriff zusammengesetzter Primärschlüssel sollte obligatorisch sein;)

Wenn Sie keine expliziten Informationen finden, versuchen Sie, eine Testdatenbank zu erstellen, um sicherzustellen, dass Sie eine stabile (und spezifische) Behandlung der zu erwartenden Grenzwertverletzungen erwarten können. Achten Sie darauf, die richtigen Informationen zu erhalten: Manchmal werden die Grenzwerte akkumuliert, und Sie sehen unterschiedliche Ergebnisse mit unterschiedlichen Datenbanklayouts.


Wolf
quelle
2

Die Verwendung eines Primärschlüssels für mehrere Tabellen ist praktisch, wenn Sie eine Zwischentabelle in einer relationalen Datenbank verwenden.

Ich werde eine Datenbank verwenden, die ich einmal für ein Beispiel erstellt habe, und speziell drei Tabellen in dieser Tabelle. Ich habe vor einigen Jahren eine Datenbank für ein Webcomic erstellt. Eine Tabelle wurde "Comics" genannt - eine Auflistung aller Comics, ihrer Titel, des Bilddateinamens usw. Der Primärschlüssel war "comicnum".

Die zweite Tabelle bestand aus "Zeichen" - ihren Namen und einer kurzen Beschreibung. Der Primärschlüssel war "charname".

Da jeder Comic - mit einigen Ausnahmen - mehrere Charaktere hatte und jeder Charakter in mehreren Comics vorkam, war es unpraktisch, eine Spalte in "Charaktere" oder "Comics" einzufügen, um dies widerzuspiegeln. Stattdessen habe ich eine dritte Tabelle mit dem Namen "Comicchars" erstellt, und das war eine Auflistung der Charaktere, die in welchen Comics vorkamen. Da diese Tabelle im Wesentlichen mit den beiden Tabellen verbunden war, wurden nur zwei Spalten benötigt: charname und comicnum, und der Primärschlüssel befand sich auf beiden.

Mr. Initial Man
quelle
1

Wir erstellen zusammengesetzte Primärschlüssel, um die Eindeutigkeitsspaltenwerte zu gewährleisten, aus denen ein einzelner Datensatz besteht. Dies ist eine Einschränkung, die das Einfügen von Daten verhindert, die nicht dupliziert werden sollten.

dh: Wenn alle Studentenausweise und Geburtsurkundennummern eindeutig einer einzelnen Person zugeordnet sind. Dann wäre es eine gute Idee, den Primärschlüssel für eine Person aus einer Studenten-ID und einer Geburtsurkunden-Nummer zusammenzusetzen, da Sie dadurch nicht versehentlich zwei Personen mit unterschiedlichen Studenten-IDs und derselben Geburtsurkunde einfügen könnten.

kiwicomb123
quelle