在MySQL中存储多对多关系的最佳方式?

时间:2010-06-30 19:46:26

标签: mysql database database-design data-modeling

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

构建数据库的最佳方法是什么?我想过使用list / serialize:

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

其实我不喜欢他们中的任何一个。还有更好的方法吗?

5 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:2)

使用带关联的表 - 这称为联结表

获取帖子的标签:

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

答案 2 :(得分:2)

您几乎肯定会想要使用“十字路口”或连接表。此表可以包含posts和tags表的主键,以及(可选)其自己的不同主键。加入这三个表应该很简单:

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

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

答案 3 :(得分:0)

使用join table

答案 4 :(得分:0)

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

否则你应该看看对象关系映射 - 它为你做了复杂的SQL查询。

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