【问题标题】:Best way to store a many-to-many relationship in MySQL?在 MySQL 中存储多对多关系的最佳方法?
【发布时间】:2011-03-10 07:59:03
【问题描述】:

假设我有一个包含“posts”和“tags”表的简单数据库。帖子可以有很多标签,标签可以属于很多帖子。

构建数据库的最佳方式是什么?我想过使用列表/序列化:

tags
idx tag_id, str tag_name

posts
idx post_id, str title, list tag_ids

或者有另一个带有关联的表。问题是使用它我什至不知道如何构造查询以在收到帖子时提取关联的标签名称。

posts
idx post_id, str title

post_tags
fk post_id, fk tag_id

其实我都不喜欢他们中的任何一个。有没有更好的办法?

【问题讨论】:

标签: mysql database database-design data-modeling


【解决方案1】:

post_tags 是在数据库中实现多对多关系的正确方法。

我对您发布的内容的唯一补充是其中的两列都应该是主键,以确保没有重复。

【讨论】:

  • 这里也是+1。不喜欢它是不这样做的一个不好的理由,尤其是如果您不是唯一维护代码的人。
  • 我说我不喜欢它,因为我认为有更好的方法。显然没有:(
【解决方案2】:

您几乎肯定会想要使用“交集”或连接表。该表可以包含帖子和标签表的主键,以及(可选)它自己的不同主键。连接三个表应该很简单:

select ...
from post_tags
inner join posts on post_tags.postID = posts.postID
inner join tags on post_tags.tagID = tags.tagID
...

您可以创建一个执行基本连接的视图,然后您可以在代码中引用它。

【讨论】:

    【解决方案3】:

    使用具有关联的表 - 这称为联结表

    要获取帖子的标签:

    SELECT tag_name FROM tags, post_tags WHERE post_tags.tag_id = tags.tag_id AND post_tags.post_id = 12345;
    

    【讨论】:

    • 不要进行隐式连接。隐式连接让我哭了。 :(
    【解决方案4】:

    使用join table

    【讨论】:

      【解决方案5】:

      我认为这是一个很好的解释: http://www.tonymarston.net/php-mysql/many-to-many.html

      否则,您应该查看对象关系映射 - 它会为您执行复杂的 sql 查询。

      例如: http://www.qcodo.com/

      【讨论】:

        猜你喜欢
        • 2016-08-08
        • 1970-01-01
        • 2012-01-05
        • 1970-01-01
        • 2012-08-15
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-02
        相关资源
        最近更新 更多