Mysql 处理桌子的两难选择?

Mysql 处理桌子的两难选择?,mysql,tags,Mysql,Tags,我有一个算法问题,在创建mysql表方面,让我解释一下场景: 我有一个posts表: Posts{id, user_id,image,tag,date} 每个帖子只能有标签!只有 我是否需要另一个表来存储标签!我可以理解,如果每个帖子都有多个标签,那么您必须为它创建另一个表来存储标签!但只有这一个 i、 e 如果我想得到所有贴有“DOG”标签的帖子,我会使用: select all posts where tag=DOG 你认为这是错的还是坏的?我太糊涂了 如果系统中的帖子实际上只需要一个标

我有一个算法问题,在创建mysql表方面,让我解释一下场景:

我有一个posts表:

Posts{id, user_id,image,tag,date}
每个帖子只能有标签!只有

我是否需要另一个表来存储标签!我可以理解,如果每个帖子都有多个标签,那么您必须为它创建另一个表来存储标签!但只有这一个

i、 e

如果我想得到所有贴有“DOG”标签的帖子,我会使用:

select all posts where tag=DOG

你认为这是错的还是坏的?我太糊涂了

如果系统中的帖子实际上只需要一个标签,那么从技术上讲,您可以在帖子记录上保留标签。但是,你不应该这样做:例如,当你有250000篇关于狗的帖子,并决定将狗标签重命名为犬科时,会发生什么

更好的方法是创建一个标记表,并将其外键放在Post表上。例如:

Post{post_id, user_id, image, tag_id, date}
Tag{tag_id, description}
Post{post_id, user_id, image, date}
Tag{tag_id, description}

Post_Tag{post_id, tag_id}
但以防万一,有一天,你真的会遇到一个场景,一篇文章可以有多个标签

然后描述一个模型,在这个模型中,post和标记存在于所谓的a中:一个给定的标记可以与任意数量的post关联,一个给定的post可以与任意数量的标记关联

现在,您不仅需要一个单独的标记表,还需要一个将POST与标记关联起来的关系表。例如:

Post{post_id, user_id, image, tag_id, date}
Tag{tag_id, description}
Post{post_id, user_id, image, date}
Tag{tag_id, description}

Post_Tag{post_id, tag_id}
然后选择带有Dog标记的所有帖子,如下所示:

SELECT p.*
FROM Post p
JOIN Post_Tag pt ON pt.post_id = p.post_id
JOIN Tag t ON pt.tag_id = t.tag_id
WHERE t.description = 'Dog'

如果系统中的帖子真的只需要一个标签,那么从技术上讲,您可以在帖子记录上保留标签。但是,你不应该这样做:例如,当你有250000篇关于狗的帖子,并决定将狗标签重命名为犬科时,会发生什么

更好的方法是创建一个标记表,并将其外键放在Post表上。例如:

Post{post_id, user_id, image, tag_id, date}
Tag{tag_id, description}
Post{post_id, user_id, image, date}
Tag{tag_id, description}

Post_Tag{post_id, tag_id}
但以防万一,有一天,你真的会遇到一个场景,一篇文章可以有多个标签

然后描述一个模型,在这个模型中,post和标记存在于所谓的a中:一个给定的标记可以与任意数量的post关联,一个给定的post可以与任意数量的标记关联

现在,您不仅需要一个单独的标记表,还需要一个将POST与标记关联起来的关系表。例如:

Post{post_id, user_id, image, tag_id, date}
Tag{tag_id, description}
Post{post_id, user_id, image, date}
Tag{tag_id, description}

Post_Tag{post_id, tag_id}
然后选择带有Dog标记的所有帖子,如下所示:

SELECT p.*
FROM Post p
JOIN Post_Tag pt ON pt.post_id = p.post_id
JOIN Tag t ON pt.tag_id = t.tag_id
WHERE t.description = 'Dog'

djacobson说您需要为未来可能的场景进行设计是正确的。如果可能的话,尽量让你的桌子保持一对多。然而,对于您的情况,如果您确定每个帖子永远不会有超过一个标记,那么您可能可以使用一个表。使用一个表显然会减少数据库大小并简化查询。但是,如果您发现可能有没有任何标记的帖子,那么您就有可能在表中出现大量空值,这也是应该避免的。然后,最好在Post和Tag表之间使用一对一的关系,或者更好地使用前面解释的一对多关系。

djacobson说您需要为未来可能的场景进行设计,这是正确的。如果可能的话,尽量让你的桌子保持一对多。然而,对于您的情况,如果您确定每个帖子永远不会有超过一个标记,那么您可能可以使用一个表。使用一个表显然会减少数据库大小并简化查询。但是,如果您发现可能有没有任何标记的帖子,那么您就有可能在表中出现大量空值,这也是应该避免的。然后,最好在帖子和标签表之间使用一对一的关系,或者更好,如前所述,使用一对多的关系。

我理解你的意思,感谢你的回答,但是一篇帖子只能与一个标签关联!是的,谢谢你的更新。标签包含一个实际的事件lol你不能同时在两个不同的事件中,对吗@乒乓球我已经更新了我的答案,以包括任何一种情况。我仍然认为,即使一篇文章只能有一个标记,也可以将标记分隔到它们自己的表中。如果有一天你决定标签应该有另一段与之相关的数据,比如宠物下面的父母标签,会发生什么?为胜利而努力是的,这是真的!!!我想我会创造另一个表实际上+1来自mecan我问你一个问题,一个标签可以是多个单词吗?例如,狗是黑色的,我确信它会起作用?@pingpong假设标签只是一个VARCHAR或类似的字段。。。我无法想象一个技术上的原因为什么那不起作用。我理解你的意思,感谢你的回答,但是一篇文章只能与一个标签关联!是的,谢谢你的更新。标签包含一个实际的事件lol你不能同时在两个不同的事件中,对吗@乒乓球我已经更新了我的答案,以包括任何一种情况。我仍然坚持你把标签分成t
继承人自己的表,即使一个职位只能有一个。如果有一天你决定标签应该有另一段与之相关的数据,比如宠物下面的父母标签,会发生什么?为胜利而努力是的,这是真的!!!我想我会创造另一个表实际上+1来自mecan我问你一个问题,一个标签可以是多个单词吗?例如,狗是黑色的,我确信它会起作用?@pingpong假设标签只是一个VARCHAR或类似的字段。。。我想不出一个技术上的原因为什么那不起作用。