現在、チームのプロジェクト用のデータベース構造を設計しています。私は現在、この非常に質問を念頭に置いています:外部キーを別のテーブルの主キーとして機能させることは可能ですか?
以下に、システムのデータベース設計のテーブルをいくつか示します。
user_accounts
students
guidance_counselors
私がやりたかったのは、user_accounts
テーブルに、学生ユーザーとガイダンスカウンセラーユーザーの両方のID(おそらくシステムへのログイン資格情報)とパスワードが含まれていることです。つまり、students
テーブルとguidance_counselors
テーブルの両方の主キーは、user_accounts
テーブルの外部キーでもあります。しかし、許可されているかどうかはわかりません。
別の質問:student_rec
テーブルも存在し、student_number
(user_id
テーブル内のuser_accounts
が必要)とguidance_counsellor_id
(これは各レコードのuser_id
のuser_accounts
)。学生のIDとガイダンスカウンセラーの両方がuser_accounts table
から来ている場合、student_rec
テーブルをどのように設計しますか?また、今後の参考のために、SQLコードとして手動で記述する方法を教えてください。
これは私を悩ませており、私の質問に対する具体的または確実な答えを見つけることができません。
もちろん。これは 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つの異なるエイリアスを割り当てて、それらを区別します。
はい、問題ないはずです。外部キーと主キーは互いに直交しており、列または列のセットがそのテーブルの主キー(一意である必要がある)であり、主キー/一意制約に関連付けられていることは問題ありません別のテーブルに。