处理表格的困境?

时间:2011-01-24 23:56:40

标签: mysql tags

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

我有一个帖子表:

Posts{id, user_id,image,tag,date}

每个帖子只能有标签! ONLY

我是否需要另一张表来存储标签!我可以理解,如果每个帖子都有多个标签,你必须创建另一个表来存储标签!但这是唯一一个!

如果我想获得带有'DOG'标签的所有帖子,我会使用:

select all posts where tag=DOG
你觉得这是错还是坏?我很困惑!

2 个答案:

答案 0 :(得分:3)

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

更好的想法是创建一个Tag表并在Post表上放置一个外键。例如:

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

但是,万一有一天,你真的面临着面临的情况,其中一个帖子可以有多个标签......

然后,您将描述一个模型,其中PostsTags存在于所谓的Many-to-Many relationship中:给定的标记可以与任意数量的帖子和给定的帖子相关联可以与任意数量的标签相关联。

现在,您不仅需要一个单独的标签表,还需要一个将帖子与标签相关联的关系表。例如:

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'

答案 1 :(得分:1)

当他说你需要为可能的未来场景设计时,djacobson是正确的。如果可能的话,总是尝试将表格保持为一对多。但是,对于您的情况,如果您确定每个帖子永远不会有多个标签,您可能可以使用单个表格。使用一个表显然会减少数据库大小并简化查询。但是,如果您发现可能存在没有任何标记的帖子,那么您将面临在表中存在大量NULL值的风险,这也应该避免。然后,最好使用Post和Tag表之间的一对一关系,或者甚至更好,如前所述的一对多关系。