2010-04-13 114 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