Tất nhiên rồi. Đây là một kỹ thuật phổ biến được gọi là supertyping những cái bàn. Như trong ví dụ của bạn, ý tưởng là một bảng chứa tập hợp siêu thực thể và có các thuộc tính chung mô tả một thực thể chung và các bảng khác chứa tập hợp con của các thực thể đó với các thuộc tính cụ thể. Nó không giống như một hệ thống phân cấp lớp đơn giản trong thiết kế hướng đối tượng.
Đối với câu hỏi thứ hai của bạn, một bảng có thể có hai cột là các khóa ngoại riêng biệt cho cùng một bảng khác. Khi cơ sở dữ liệu xây dựng truy vấn, nó sẽ tham gia bảng khác đó hai lần. Để minh họa trong một câu truy vấn SQL (không chắc về cú pháp MySQL, tôi đã lâu không sử dụng nó, vì vậy đây là cú pháp MS SQL cụ thể), bạn sẽ cung cấp cho bảng đó hai bí danh riêng biệt khi chọn dữ liệu. Một cái gì đó như thế này:
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
Điều này về cơ bản lấy student_rec
và kết hợp nó với user_accounts
bảng hai lần, một lần trên mỗi cột và chỉ định hai bí danh khác nhau khi kết hợp chúng để phân biệt chúng.