2010-04-13 53 views
5

最近我一直在閱讀外鍵和連接,並且很驚喜,許多基本概念都是我已經付諸實踐的東西。例如,一個項目中,我目前的工作,我組織的單詞列表,並有一個表的集合,像這樣:MySQL中的多對多關係

`words` Table 
    `word_id` 
    `headword` 
    `category_id` 
`categories` Table 
    `category_id` 
    `category_name` 

現在,一般來說這將是一個一對一很多關係,幾個詞被放在一個單一的類別下,外鍵爲category_id。然而,讓我們暫時假設用戶選擇向單詞添加另一個類別,使其成爲多對多 - 是否可以設置我的words表來處理單詞的其他類別,而不會創建額外的列,如category_2category_3等?

回答

12

通常你有一個單獨的表來處理這些映射:

`Words_Categories` Table 
    `word_id` 
    `category_id` 

每對在此Words_Categories表代表從任何單詞的任何其他類別的一個可能的映射。

根據此方案,Words表中的category_id字段變爲不需要,因爲這兩個表都不直接互相引用。

+0

對於多對多連接表,它是否總是具有複數形式?至少,這是公約嗎? – Thufir 2012-07-28 08:23:13

4

您將從單詞表中刪除category_id,並且擁有包含word_id,category_id(通常是唯一索引或約束)的word_category表,該表通常稱爲鏈接表或橋表。這是多對多關係的典型標準化結構。

由於很多原因,在單詞表中有多個category_id列是不可取的,這就是爲什麼普通形式消除「數組」存儲在行中的原因。

+0

「通常稱爲鏈接表或橋表」感謝您在此添加術語。 – 2010-09-02 05:29:04

6

您絕不能創建額外的列,如category_2和category_3。那種方式就是瘋狂。

相反,您會從「words」表中刪除「category_id」列。然後,您將創建一個新的表「category_words」與列「category_id」和「word_id」。要將單詞放入類別中,請在此表格中插入一條記錄。要將相同的單詞放入另一個類別,請在表格中插入另一條記錄。

+4

+1「這種方式是瘋狂的!」 ;) – FrustratedWithFormsDesigner 2010-04-13 20:41:56