Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kann ein Fremdschlüssel als Primärschlüssel fungieren?

Natürlich. Dies ist eine gängige Technik, die als Supertyping bekannt ist Tische. 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 Teilmengen dieser 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 dieselbe andere Tabelle sind. Wenn die Datenbank die Abfrage erstellt, fügt sie diese andere Tabelle zweimal hinzu. Zur Veranschaulichung in einer SQL-Abfrage (ich bin mir bei der MySQL-Syntax nicht sicher, ich habe sie lange nicht verwendet, also ist dies speziell die MS SQL-Syntax), würden Sie dieser Tabelle zwei unterschiedliche Aliase geben, wenn Sie Daten auswählen. Etwa so:

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 nimmt im Wesentlichen den student_rec Tabelle und kombiniert sie mit den user_accounts Tabelle zweimal, einmal in jeder Spalte, und weist zwei verschiedene Aliase zu, wenn sie kombiniert werden, um sie voneinander zu unterscheiden.