+1 Matt Fenwick。我想補充一點,你想對你的外鍵約束有點小心。你基本上有兩個選擇,這兩個選項可能最終看起來非常相似,取決於你選擇的主鍵。
選擇一是:忘記TEACHER
和INSTRUMENT
之間的簡單交叉點,並用一個複雜的交叉點,其包括teacher_id
,instrument_id
和level_id
替換它。所有這三列都是該交點表的(複合)主鍵。在此選項中,您有在teacher_id
和instrument_id
(和level_id
,如果這實際上是LEVEL
表的外鍵而不僅僅是整數或字符串代碼)上定義的外鍵約束。
選擇二是:保持TEACHER
和INSTRUMENT
之間的簡單交叉點(姑且稱之爲TEACHER_INSTRUMENT
即使是缺乏想象力的),並添加定義可以教水平的子子表。這個子子表(我們稱之爲SKILL
)具有level_id
和TEACHER_INSTRUMENT
的外鍵。如果TEACHER_INSTRUMENT
的主鍵是teacher_id
和instrument_id
的組合,那麼表SKILL
將具有與選項1中相同的三列。是什麼讓這個選擇不同?從SKILL
外鍵約束必須是交集表,不TEACHER
和INSTRUMENT
。
爲什麼這很重要?如果您選擇選項一,您可能需要有一些額外的查詢邏輯才能獲得完全填充的技能網格,因爲沒有參照完整性約束,您可以定義這個約束以確保爲每個教師/工具組合填充所有技能級別。
另一方面,如果您選擇選項二,您可以分開關注誰可以使用什麼以及他們可以如何教他們的問題。
你想要避免的是讓一張表只包含教師/樂器關係,然後再一個(獨立地)重複這種關係但添加技能水平細節。如果你這樣做,那麼你冒着這兩件事失去同步的風險。
非常感謝您的詳細解答!兩個答案都非常有幫助。 –