2013-07-14 10 views
17

Ich entwerfe gerade eine Datenbankstruktur für das Projekt unseres Teams. Ich habe gerade diese Frage im Hinterkopf: Ist es möglich, einen Fremdschlüssel als Primärschlüssel an einem anderen Tisch zu haben?Kann ein Fremdschlüssel als Primärschlüssel fungieren?

Hier sind einige der Tabellen der Datenbank-Design unseres Systems:

user_accounts 
students 
guidance_counselors 

Was ich ist, dass die user_accounts Tabelle sind die IDs (angeblich die Login-Berechtigungsnachweis für das System) und Passwörter von beiden enthalten sollte passieren wollte die Benutzer der Studenten und die Berater der Beratungsberater. Kurz gesagt, die Primärschlüssel der Tabellen und guidance_counselors sind auch die Fremdschlüssel aus der Tabelle user_accounts. Aber ich bin mir nicht sicher, ob es erlaubt ist.

Eine andere Frage ist: ein student_rec Tabelle existiert auch, die eine student_number erfordert (die user_id in der user_accounts Tabelle ist) und ein guidance_counsellor_id (das ist auch die user_id im user_accounts) für jeden seiner Rekord. Wenn sowohl die IDs eines Studenten als auch die eines Beraters aus der user_accounts table stammen, wie würde ich die Tabelle student_rec entwerfen? Und wie schreibe ich es manuell als SQL-Code für zukünftige Referenz?

Das hat mich gestört und ich kann keine spezifische oder sichere Antwort auf meine Fragen finden.

+1

Während die Antwort auf Ihre Frage ist "Ja, ein Primärschlüssel kann auch als Fremdschlüssel fungieren", wäre meine Empfehlung, dies zu vermeiden. Die gleiche Beziehung kann unter Verwendung von diskreten Primärschlüsseln und Fremdschlüsseln ausgedrückt werden, und das Überladen einer Spalte mit mehreren Verantwortlichkeiten kann Schwierigkeiten auf der Straße verursachen. Wenn der Primärschlüssel beispielsweise ebenfalls eine Identitätsspalte ist oder automatisch über eine ORM-Richtlinie mit einer GuidComb-Strategie zugewiesen wird, werden Sie sich wahrscheinlich zwei oder mehr Transaktionen ansehen. Das Single-Responsibility-Prinzip ist auch gut für das Datenbankdesign. –

Antwort

21

Natürlich. Dies ist eine übliche Technik, die als supertyping Tabellen bekannt ist. Wie in Ihrem Beispiel besteht die Idee darin, dass eine Tabelle eine Obermenge von Entitäten enthält und gemeinsame Attribute aufweist, die eine allgemeine Entität beschreiben, und andere Tabellen Untermengen von Entitäten mit bestimmten Attributen enthalten. Es ist einer einfachen Klassenhierarchie im objektorientierten Design nicht unähnlich.

Für Ihre zweite Frage kann eine Tabelle zwei Spalten haben, die separat Fremdschlüssel für die gleiche andere Tabelle sind. Wenn die Datenbank die Abfrage erstellt, verknüpft sie diese andere Tabelle zweimal. Um in einer SQL-Abfrage zu veranschaulichen (ich bin nicht sicher über MySQL-Syntax, ich habe es seit langer Zeit nicht mehr verwendet, so ist dies MS SQL-Syntax speziell), würden Sie dieser Tabelle zwei verschiedene Aliase bei der Auswahl von Daten geben. Etwas wie folgt aus:

SELECT 
    student_accounts.name AS student_name, 
    counselor_accounts.name AS counselor_name 
FROM 
    student_rec 
    INNER JOIN user_accounts AS student_accounts 
     ON student_rec.student_number = student_accounts.user_id 
    INNER JOIN user_accounts AS counselor_accounts 
     ON student_rec.guidance_counselor_id = counselor_accounts.user_id 

Dies resultierte im Wesentlichen nimmt die student_rec Tisch und kombiniert sie mit der user_accounts Tabelle zweimal, einmal in jeder Spalte und weist zwei unterschiedliche Aliasnamen, wenn die Kombination von ihnen, um sie auseinander zu halten.

+0

Dies ist nur eine Situation, in der ein Spaltensatz sowohl ein FK als auch ein PK ist. Jede Art von Schlüssel wird unabhängig von der anderen definiert. – philipxy

2

Ja, es sollte kein Problem geben. Fremdschlüssel und Primärschlüssel sind orthogonal zueinander, und es ist in Ordnung, wenn eine Spalte oder eine Gruppe von Spalten sowohl der Primärschlüssel für diese Tabelle (der sie eindeutig sein müssen) als auch einer Primärschlüssel/Eindeutigkeitsbedingung zugeordnet werden soll in einer anderen Tabelle.

Verwandte Themen