Hier ist eine grobe Vereinfachung eines intensiven Setups, mit dem ich arbeite. table_1
und table_2
beide haben automatisch inkrementierte Ersatzprimärschlüssel als ID. info
ist eine Tabelle, die Informationen zu table_1
und enthält table_2
.
table_1 (id, field)
table_2 (id, field, field)
info ( ???, field)
Ich versuche zu entscheiden, ob ich den Primärschlüssel info
einer Zusammenstellung der IDs aus table_1
und erstellen soll table_2
. Wenn ich das tun würde, welche davon ist am sinnvollsten?
(In diesem Beispiel kombiniere ich ID 11209 mit ID 437)
INT(9)
11209437 (ich kann mir vorstellen, warum das schlecht ist)
VARCHAR (10)
11209-437
DECIMAL (10,4)
11209.437
Oder etwas anderes?
Wäre es in Ordnung, dies als Primärschlüssel in einer MYSQL MYISAM-Datenbank zu verwenden?
Antworten:
Ich würde einen zusammengesetzten (mehrspaltigen) Schlüssel verwenden.
Auf diese Weise können Sie t1ID und t2ID als Fremdschlüssel verwenden, die auch auf die jeweiligen Tabellen verweisen.
quelle
UPDATE info ... WHERE t1ID=11209 AND t2ID=437
?Ich würde den Primärschlüssel der "info" -Tabelle nicht aus den beiden Werten anderer Tabellen zusammensetzen.
Andere können die Gründe besser artikulieren, aber es fühlt sich falsch an, eine Spalte zu haben, die wirklich aus zwei Informationen besteht. Was ist, wenn Sie aus irgendeinem Grund die ID aus der zweiten Tabelle sortieren möchten? Was ist, wenn Sie zählen möchten, wie oft ein Wert aus einer der Tabellen vorhanden ist?
Ich würde diese immer als zwei verschiedene Spalten behalten. Sie könnten einen zweispaltigen Primay-Schlüssel in mysql verwenden ... PRIMARY KEY (id_a, id_b) ... aber ich bevorzuge die Verwendung eines zweispaltigen eindeutigen Index und ein automatisch inkrementiertes Primärschlüsselfeld.
quelle
Die Syntax lautet
CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3)
zum Beispiel ::CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
Das obige Beispiel funktioniert, wenn Sie es schreiben, während Sie die Tabelle erstellen, zum Beispiel ::
Um diese Einschränkung zu einer vorhandenen Tabelle hinzuzufügen, müssen Sie die folgende Syntax befolgen
quelle
Angenommen, Sie haben bereits eine Tabelle erstellt. Mit dieser Abfrage können Sie einen zusammengesetzten Primärschlüssel erstellen
quelle
Abgesehen von persönlichen Designpräferenzen gibt es Fälle, in denen zusammengesetzte Primärschlüssel verwendet werden sollen. Tabellen können zwei oder mehr Felder enthalten, die eine eindeutige Kombination bieten, und zwar nicht unbedingt über Fremdschlüssel.
Beispielsweise hat jeder US-Bundesstaat eine Reihe einzigartiger Kongressbezirke. Während viele Staaten einzeln eine CD-5 haben können, wird es in keinem der 50 Staaten mehr als eine CD-5 geben und umgekehrt. Daher wäre das Erstellen eines Felds für die automatische Nummerierung für Massachusetts CD-5 überflüssig.
Wenn die Datenbank eine dynamische Webseite steuert, kann das Schreiben von Code zum Abfragen in einer Kombination aus zwei Feldern viel einfacher sein als das Extrahieren / erneutes Senden eines automatisch nummerierten Schlüssels.
Obwohl ich die ursprüngliche Frage nicht beantworte, schätze ich Adams direkte Antwort auf jeden Fall.
quelle
Zusammengesetzte Primärschlüssel sind das, was Sie möchten, wenn Sie eine Viele-zu-Viele-Beziehung zu einer Faktentabelle erstellen möchten. Beispielsweise könnten Sie ein Ferienpaket haben, das eine Reihe von Immobilien enthält. Andererseits könnte die Immobilie auch als Teil einer Reihe von Mietpaketen entweder allein oder mit anderen Immobilien verfügbar sein. In diesem Szenario stellen Sie die Beziehung zwischen der Immobilie und dem Mietpaket mit einer Faktentabelle für Immobilien / Pakete her. Die Zuordnung zwischen einer Eigenschaft und einem Paket ist eindeutig. Sie werden immer nur mit property_id mit der Eigenschaftentabelle und / oder package_id mit der Pakettabelle verbunden. Jede Beziehung ist eindeutig und ein auto_increment-Schlüssel ist redundant, da er in keiner anderen Tabelle enthalten ist. Daher ist die Definition des zusammengesetzten Schlüssels die Antwort.
quelle
quelle
@AlexCuse Ich wollte dies als Kommentar zu Ihrer Antwort hinzufügen, gab aber nach mehreren fehlgeschlagenen Versuchen auf, Zeilenumbrüche in Kommentare einzufügen.
Das heißt, t1ID ist in Tabelle_1 eindeutig, aber das macht es auch nicht in der INFO-Tabelle eindeutig.
Beispielsweise:
Tabelle_1 hat: ID-
Feld
1 A
2 B.
Tabelle_2 hat: ID-
Feld
1 X
2 Y.
INFO kann dann haben:
t1ID t2ID Feld
1 1 einige
1 2 Daten
2 1 in jeder
2 2 Zeile
In der INFO-Tabelle benötigen Sie also sowohl t1ID als auch t2ID, um eine Zeile eindeutig zu identifizieren
quelle