2011-11-16 78 views
2

設計此數據庫的正確方法是什麼?將第三個錶鏈接到多對多關聯中的橋接表

這裏是我有我的表設置:

我有很多的表叫老師和一個名爲儀器表之間一對多的關係。然後我有一個橋表連接兩個。我想將另一張桌子與BRIDGE表相關聯。意味着儀器/教師的組合。該表格將有3行指定教師可以教什麼級別(即初學者,中級,高級)。似乎我應該設置bridge_table以具有teacher_id,instrument_id和level_id,但我不知道這是否是常規方式。

我正在使用mysql和cakephp,並且在關於在橋表中有一個額外字段的HABTM關聯文檔中沒有找到任何內容。只是想確保我正確地做到了。

回答

3

如果這就是您的數據所要求的,聽起來像是這樣,那就去做吧。

基本上,正如你指出,你有一個三部分關鍵:

  • teacher_id
  • INSTRUMENT_ID
  • level_id

這意味着教師可以在教授吉他初學者和高級,鋼琴在中級和初學者,另一位老師可以在三級和雙簧管教初學者...聽起來不錯。


順便提及,橋接表也被稱爲一個intersectintersection或表。

4

+1 Matt Fenwick。我想補充一點,你想對你的外鍵約束有點小心。你基本上有兩個選擇,這兩個選項可能最終看起來非常相似,取決於你選擇的主鍵。

選擇一是:忘記TEACHERINSTRUMENT之間的簡單交叉點,並用一個複雜的交叉點,其包括teacher_idinstrument_idlevel_id替換它。所有這三列都是該交點表的(複合)主鍵。在此選項中,您有在teacher_idinstrument_id(和level_id,如果這實際上是LEVEL表的外鍵而不僅僅是整數或字符串代碼)上定義的外鍵約束。

選擇二是:保持TEACHERINSTRUMENT之間的簡單交叉點(姑且稱之爲TEACHER_INSTRUMENT即使是缺乏想象力的),並添加定義可以教水平的子子表。這個子子表(我們稱之爲SKILL)具有level_idTEACHER_INSTRUMENT的外鍵。如果TEACHER_INSTRUMENT的主鍵是teacher_idinstrument_id的組合,那麼表SKILL將具有與選項1中相同的三列。是什麼讓這個選擇不同?SKILL外鍵約束必須是交集表,不TEACHERINSTRUMENT

爲什麼這很重要?如果您選擇選項一,您可能需要有一些額外的查詢邏輯才能獲得完全填充的技能網格,因爲沒有參照完整性約束,您可以定義這個約束以確保爲每個教師/工具組合填充所有技能級別。

另一方面,如果您選擇選項二,您可以分開關注誰可以使用什麼以及他們可以如何教他們的問題。

你想要避免的是讓一張表只包含教師/樂器關係,然後再一個(獨立地)重複這種關係但添加技能水平細節。如果你這樣做,那麼你冒着這兩件事失去同步的風險。

+0

非常感謝您的詳細解答!兩個答案都非常有幫助。 –