2017-11-23 4 views
0

Ich habe eine Datenbank, die eine Tabelle namens U und eine Tabelle namens P enthält.In M: N Datenbankbeziehung ist es besser, durch eine zusammengesetzte PK oder zwei Fremdschlüssel zu referenzieren

table U 
    U_Id primary key. 

table P 
P_Id primary key 

Es gibt viele zu viele Beziehung zwischen den beiden Tabellen.

Ich habe zwei Möglichkeiten Beziehung zwischen den beiden Tabelle zu erstellen:

1) Erstellen Sie eine neue Tabelle, die einen zusammengesetzten Primärschlüssel (U_Id enthält, p_id)

2) eine neue Tabelle erstellen, die Verweise enthält aus U-Tabelle und P-Tabelle als Fremdschlüssel.

(U_id und p_id als Fremdschlüssel)

Third_Table 

U_id FK not null 

P_Id FK not null 

Was die bessere Option?

+0

Für Leistung in einem viele: viele Tabelle: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table –

Antwort

1

Optionen 1 und 2 sind nicht entgegengesetzt. Ihre Beziehungstabelle enthält U_Id und P_Id als Fremdschlüssel, und die Kombination dieser beiden Spalten sollte mindestens als eindeutiger Schlüssel, wenn nicht als Primärschlüssel markiert werden.

Einige DB-Designer bevorzugen die Einführung einer Ersatzkennung als Primärschlüssel. Andere (einschließlich mir) bevorzugen die Kombination von Fremdschlüsseln als Primärschlüssel.

0

2) Erstellen Sie eine neue Tabelle, die Verweise von U-Tabelle und P-Tabelle als Fremdschlüssel enthält.

Das brauchen Sie für die referentielle Integrität, sonst könnte die dritte Tabelle Werte haben, die sich auf nichts beziehen. (Hurray für many-to-nichts Reihen!)

1) eine neue Tabelle erstellen, die einen zusammengesetzten Primärschlüssel (U_Id enthält, p_id)

Wenn Sie das nicht tun, Was wird der Primärschlüssel für den 3. Tisch sein? Es wird einen haben, oder?

Ein Primärschlüssel ist eine Form der eindeutigen Einschränkung. Wenn eine Tabelle mehr als eine eindeutige Integritätsbedingung aufweist, ist die Wahl, welche der Primärschlüssel aufgerufen wird, willkürlich. In Ihrem Fall gibt es jedoch nur einen.

Sie benötigen eine eindeutige Einschränkung für die 3. Tabelle, um doppelte Zeilen zu vermeiden. Primary Key (U_Id,P_Id) sagt als jedes {U_Id,P_Id} Paar ist einzigartig und identifiziert diese Beziehung. Von dem, was du sagst, das willst du.

0

Ich würde einen zusammengesetzten Schlüssel erwarten, der aus zwei Fremdschlüsseln besteht. Beispielcode (ungetestet):

CREATE TABLE Q 
(u_id INT NOT NULL FOREIGN KEY REFERENCES U (u_id), 
p_id INT NOT NULL FOREIGN KEY REFERENCES P (u_id), 
PRIMARY KEY (u_id, pi_id)); 
Verwandte Themen