Mysql
 sql >> Database >  >> RDS >> Mysql

Una chiave esterna può fungere da chiave primaria?

Ovviamente. Questa è una tecnica comune nota come supertipizzazione tavoli. Come nel tuo esempio, l'idea è che una tabella contenga un superset di entità e abbia attributi comuni che descrivono un'entità generale e altre tabelle contengano sottoinsiemi di quelle entità con attributi specifici. Non è diverso da una semplice gerarchia di classi nella progettazione orientata agli oggetti.

Per la tua seconda domanda, una tabella può avere due colonne che sono chiavi esterne separate per la stessa altra tabella. Quando il database crea la query, si unisce all'altra tabella due volte. Per illustrare in una query SQL (non sono sicuro della sintassi di MySQL, non la uso da molto tempo, quindi questa è in particolare la sintassi di MS SQL), daresti a quella tabella due alias distinti quando selezioni i dati. Qualcosa del genere:

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

Questo essenzialmente richiede student_rec tabella e la combina con user_accounts tabella due volte, una su ciascuna colonna, e assegna due alias diversi quando li combina in modo da distinguerli.