【问题标题】:Database design: Likes table数据库设计:喜欢表
【发布时间】:2012-08-27 13:45:22
【问题描述】:

我有两张桌子(现在):

  1. Topic
  2. Post(帖子是对某个话题的评论)

我想为这些对象添加喜欢选项。
所以我考虑创建一个 Likes 表并使用枚举来指示喜欢哪个对象(当然包括对象的 id)。

顺便说一句,如果我选择这个选项,它应该是一个枚举还是另一个表代表所有对象:

id 对象名称
1 个主题
2 个帖子

另一种选择是为每个对象创建喜欢表。

最佳实践是什么?

【问题讨论】:

    标签: database database-design normalization data-warehouse


    【解决方案1】:

    我认为为每个对象创建一个单独的表会更好。

    如果你只使用一张桌子,我看不出你会得到什么。您也不能在一张表中正确使用外键。

    我的意思是您不能将列object_id 添加到您的表中,因为您不知道它将指向的表。在这种情况下,您有两个添加两列,topic_idpost_id。两者之一总是NULL

    【讨论】:

    • 但我可以让一个枚举代表所有对象,或者为此使用objects_table
    • @socksocket 不要使用enum 进行标准化。
    • @njk 所以使用 objects_table 可以吗?
    • @socksocket 我不明白你的问题。
    【解决方案2】:

    根据您跟踪“喜欢”的方式,我建议添加另一个名为 likes 的表,效果如下:

    likes (like_id, like_type)
    

    从现在开始,您只需 COUNT() 为每个 like_type(主题/帖子)提供“喜欢”的数量,因为每当有人喜欢某个主题或帖子时,就会插入一条记录。但是,如果您计划按用户跟踪“喜欢”,则需要为用户添加另一列。

    如果您想跟踪单个帖子或主题,您将为每个对象设置一个表并为主题或帖子创建外键约束@​​987654325@。

    topic_likes (tl_id, topic_id)
    post_likes (pl_id, post_id)
    

    上面的设计会为每个赞创建一个条目。如果您只关心每个对象的总点赞数,您可以这样设置:

    likes (like_id, like_type, likes)
    

    【讨论】:

    • 可以,但是你不能追踪like对象(你不能使用外键)。
    • 放弃 OP 对“对象”的一般要求。
    • 嗯,是的。如果他不关心具体的主题或帖子,那么你的解决方案就完美了。
    【解决方案3】:

    只需为喜欢创建另一个表:

    tbl_posts_likes(likeID、userID、postID、like = 1、like = -1)

    然后你可以写一个子查询,比如:

    SELECT SUM(like) as likeCount, SUM(unlike)
    FROM tbl_posts_likes
    GROUP BY postID
    WHERE postID= posts.postID
    

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 2020-05-30
      • 1970-01-01
      • 2010-12-25
      • 2014-10-01
      • 2012-07-24
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      相关资源
      最近更新 更多