もちろん。これは、スーパータイピング として知られる一般的な手法です。 テーブル。あなたの例のように、1つのテーブルにはエンティティのスーパーセットが含まれ、一般的なエンティティを説明する共通の属性があり、他のテーブルには特定の属性を持つエンティティのサブセットが含まれているという考え方です。オブジェクト指向設計の単純なクラス階層と同じです。
2番目の質問では、1つのテーブルに2つの列を含めることができます。これらの列は、同じ他のテーブルへの個別の外部キーです。データベースがクエリを作成するとき、他のテーブルを2回結合します。 SQLクエリで説明するために(MySQL構文についてはよくわかりませんが、長い間使用していなかったため、これは具体的にはMS SQL構文です)、データを選択するときにそのテーブルに2つの異なるエイリアスを指定します。このようなもの:
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
これには基本的にstudent_rec
が必要です テーブルを作成し、user_accounts
と組み合わせます テーブルを2回、各列に1回ずつ配置し、それらを区別するために組み合わせるときに2つの異なるエイリアスを割り当てます。