web-dev-qa-db-ja.com

外部キーは主キーとして機能できますか?

現在、チームのプロジェクト用のデータベース構造を設計しています。私は現在、この非常に質問を念頭に置いています:外部キーを別のテーブルの主キーとして機能させることは可能ですか?

以下に、システムのデータベース設計のテーブルをいくつか示します。

user_accounts
students
guidance_counselors

私がやりたかったのは、user_accountsテーブルに、学生ユーザーとガイダンスカウンセラーユーザーの両方のID(おそらくシステムへのログイン資格情報)とパスワードが含まれていることです。つまり、studentsテーブルとguidance_counselorsテーブルの両方の主キーは、user_accountsテーブルの外部キーでもあります。しかし、許可されているかどうかはわかりません。

別の質問:student_recテーブルも存在し、student_numberuser_idテーブル内のuser_accountsが必要)とguidance_counsellor_id(これは各レコードのuser_iduser_accounts)。学生のIDとガイダンスカウンセラーの両方がuser_accounts tableから来ている場合、student_recテーブルをどのように設計しますか?また、今後の参考のために、SQLコードとして手動で記述する方法を教えてください。

これは私を悩ませており、私の質問に対する具体的または確実な答えを見つけることができません。

17
christianleroy

もちろん。これは supertyping テーブルとして知られる一般的な手法です。例のように、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つの異なるエイリアスを割り当てて、それらを区別します。

22
David

はい、問題ないはずです。外部キーと主キーは互いに直交しており、列または列のセットがそのテーブルの主キー(一意である必要がある)であり、主キー/一意制約に関連付けられていることは問題ありません別のテーブルに。

2
michel-slm