【问题标题】:How to design a "I like" and "I don't like" system?如何设计一个“我喜欢”和“我不喜欢”的系统?
【发布时间】:2011-08-14 05:48:36
【问题描述】:

我需要创建一个投票系统。

即使投票不同,也可能适用于两个实体(目前,但可能不会有太大变化)。

这两个实体是文章和评论,但是 cmets 只能被投票(很像 SO 与答案和 cmets 一起使用)。

虽然为了避免 DRY 原则,我可以使用 Vote 实体,然后为文章和评论添加关系表,但我的“投票”更像是“我喜欢”和“我不喜欢” " 我需要计算一下,它不像 "+1 和/或 -1" 所以我不确定它是否可以同时应用于文章和评论。

关于如何设计这样的系统有什么想法吗?

顺便说一句,我正在使用 Doctrine 2 和 Zend Framework。

【问题讨论】:

  • 我只需为表中的每个喜欢的项目添加一列,并给它一个起始“喜欢”分数0。然后随心所欲地增加/减少。
  • @Blender:你需要追踪谁投票。
  • @Blender:我注意到 SO 上的人有时会在 cmets 中给出答案。你的想法是什么?我只是想适应 SO 文化。
  • @SLaks,然后为每个用户添加一个新列,并添加投票元素的 ID。 @k to the z,我这样做是因为我没有 Zend 或类似的经验。
  • @Blender:你需要一个单独的表格。

标签: php database database-design doctrine-orm


【解决方案1】:

好的...我认为这不是您所需要的,但它就在这里..

你真的应该看看这个视频:Building Web Reputation Systems

关于问题:我认为您不应该将文章和评论混为一谈。它们代表不同类型的实体。

我将为CommentVotesArticleVotes 创建单独的表,然后在CommentsArticles 中都有一个名为total_likesArticles 的行另外total_dislikes(这样你就不用'不必每次都重新计算金额)。

【讨论】:

  • +1,然后在文章和评论实体上添加一个计算这些值并设置它们的方法。然后可以从评论实体上的 @PostUpdate 方法调用这些方法。然后它是自动化的。
  • 嗨,我的想法是分开评论和文章,评论投票和文章投票,但只有一个投票实体
  • 我猜这个“实体”概念来自您的 ORM。因为我看不到将 CommentVotes 映射到 php 中的任何类的意义。它只是 Mapper for Comments 对象使用的另一个表。
【解决方案2】:

我不熟悉 Doctrine,但您的数据库看起来像这样:

article_votes(
    article_id, 
    user_id,
    score,
    primary key( article_id, user_id )
);
comment_votes(
    comment_id,
    user_id,
    primary key( comment_id, user_id )
);

对于 article_votes,得分可以是 +1 表示喜欢或 -1 表示不喜欢。对于comment_votes,您可以添加一个分数列,以防您将来希望允许不喜欢。主键阻止用户对文章或评论多次投票。要获得总喜欢或不喜欢,您可以选择计数 WHERE score=1WHERE score=-1;要获得文章的总分,您可以选择 sum。

【讨论】:

    【解决方案3】:

    我认为您描述的系统可以正常工作。查询数据库时,您将知道您尝试获取信息的实体类型,因此您将知道要运行哪个查询。

    投票表

    5 是文章,6 是评论

    id   user  parent  vote
    3      3     5      1   vote
    4      3     6     -1   dislike
    5      4     6      1   like
    

    获得对文章的投票

    select count(votes) from votes where parent=ARTICLE_ID
    

    获得对评论的喜欢/不喜欢

    select (select count(vote) from votes where vote=-1 and parent=3) as dislikes, (select count(vote) from votes where vote=1 and parent=3) as likes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2017-09-06
      相关资源
      最近更新 更多