マットフェンウィックの+1。外部キーの制約に少し注意したいということを付け加えておきます。基本的に2つのオプションがあり、主キーの選択によっては、どちらも非常によく似たものになる可能性があります。
オプション1 は:TEACHER
間の単純な交差点を忘れてください およびINSTRUMENT
teacher_id
を含む複雑な交差点に置き換えます 、instrument_id
およびlevel_id
。これらの3つの列はすべて、この交差テーブルの(複合)主キーになります。このオプションでは、teacher_id
に外部キー制約が定義されています。 およびinstrument_id
(およびlevel_id
これが実際にLEVEL
への外部キーである場合 整数または文字列コードだけでなく、テーブル)。
オプション2 is:TEACHER
間の単純な交差点を維持します およびINSTRUMENT
(TEACHER_INSTRUMENT
と呼びましょう それは想像を絶するものですが)、教えることができるレベルを定義するサブ子テーブルを追加します。このサブ子テーブル(SKILL
と呼びましょう )level_id
があります およびTEACHER_INSTRUMENT
への外部キー 。 TEACHER_INSTRUMENT
の主キーの場合 teacher_id
の組み合わせです およびinstrument_id
次に、SKILL
テーブルには、オプション1と同じ3つの列があります。このオプションの違いは何ですか? からの外部キー制約 SKILL
交差点テーブルにある必要があります。 TEACHER
および INSTRUMENT
。
これが重要なのはなぜですか? オプション1を選択した場合、スキルの完全に入力されたグリッドを取得するために、追加のクエリロジックが必要になる場合があります。これは、教師と機器の組み合わせごとにすべてのスキルレベルが入力されるように定義できる参照整合性制約がないためです。
一方、オプション2を選択した場合、誰が何を使用でき、どれだけ上手に教えることができるかという関心の分離という利点があります。
避けたいのは、教師と楽器の関係だけを含む1つのテーブルと、(独立して)その関係を繰り返しながらスキルレベルの詳細を追加する2番目のテーブルを用意することです。そうすると、これら2つのことが同期しなくなるリスクがあります。