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.