【问题标题】:Many-to-Many Relationships in MySQLMySQL中的多对多关系
【发布时间】:2011-02-07 15:28:49
【问题描述】:

我最近一直在阅读有关外键和连接的内容,并且很惊喜地发现许多基本概念都是我已经付诸实践的东西。例如,对于我目前正在从事的一个项目,我正在组织单词列表,并为这些集合提供一个表格,如下所示:

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

现在,一般来说,这将是一个一对多的关系,几个单词被放置在一个具有外键category_id 的类别下。然而,让我们假设用户选择向一个单词添加另一个类别,使其成为多对多—有没有办法设置我的words 表来处理单词的其他类别而不创建额外的列比如category_2category_3等等?

【问题讨论】:

    标签: mysql join database-design foreign-keys many-to-many


    【解决方案1】:

    通常你有一个单独的表来处理这些映射:

    `Words_Categories` Table
        `word_id`
        `category_id`
    

    Words_Categories 表中的每一对都表示从任何单词到任何其他类别的一个可能映射。

    Words 表中的 category_id 字段在此方案下变得不需要,因为这两个表都没有直接相互引用。

    【讨论】:

    • 对于多对多连接表是否总是同时使用复数形式?至少,这是约定吗?
    【解决方案2】:

    您将从 words 表中删除 category_id,并拥有一个 word_category 表,其中包含 word_id、category_id(通常是唯一索引或约束),通常称为链接表或桥表。这是多对多关系的典型规范化结构。

    在 words 表中包含多个 category_id 列是不可取的,原因有很多,这就是标准形式消除“数组”以行存储的原因。

    【讨论】:

    • “通常称为链接表或桥接表”感谢您在此处添加术语。
    【解决方案3】:

    您不得创建额外的列,例如 category_2 和 category_3。那就是疯狂。

    相反,您将从“words”表中删除“category_id”列。然后,您将创建一个新表“category_words”,其中包含“category_id”和“word_id”列。要将单词放入类别中,请在此表中插入一条记录。要将同一个词放入另一个类别,请在表中插入另一条记录。

    【讨论】:

      猜你喜欢
      • 2014-12-11
      • 2011-04-05
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      相关资源
      最近更新 更多