Oczywiście. Jest to powszechna technika znana jako nadpisywanie tabele. Tak jak w twoim przykładzie, pomysł polega na tym, że jedna tabela zawiera nadzbiór encji i ma wspólne atrybuty opisujące encję ogólną, a inne tabele zawierają podzbiory tych encji o określonych atrybutach. Nie różni się to od prostej hierarchii klas w projektowaniu zorientowanym obiektowo.
W przypadku drugiego pytania jedna tabela może mieć dwie kolumny, które są oddzielnie kluczami obcymi do tej samej innej tabeli. Gdy baza danych tworzy zapytanie, dwukrotnie dołącza do tej innej tabeli. Aby zilustrować to w zapytaniu SQL (nie jestem pewien co do składni MySQL, nie używałem jej od dłuższego czasu, więc jest to konkretnie składnia MS SQL), przy wybieraniu danych nadasz tej tabeli dwa różne aliasy. Coś takiego:
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
Zasadniczo zajmuje to student_rec
tabeli i łączy ją z user_accounts
tabeli dwa razy, raz w każdej kolumnie i przypisuje dwa różne aliasy podczas ich łączenia, aby je odróżnić.