【发布时间】:2016-10-11 13:40:18
【问题描述】:
我正在尝试为网站的现有 cmets 部分创建类似于 Facebook 的 Like/Unlike 系统,我在设计系统时需要帮助。
目前,网站上的每个产品都有一个 cmets 部分,会员可以发布和喜欢 cmets。我需要知道每个成员发布了多少个 cmets,他的每个 cmets 收到了多少个赞。当然,出于分析目的,我还需要知道谁也喜欢什么 cmets(部分原因是为了防止用户多次喜欢评论)。
对当前 cmets 模块实现 Like 系统的简单方法是在数据库中创建一个新表,该表具有 CommentID 和 UserID 的外键。然后,对于用户给评论的每一个“赞”,我都会在这个新表中插入一行,其中包含目标评论 ID 和用户 ID。
虽然这可能行得通,但大量的 cmets 和用户将导致此表快速增长,并且从这个巨大的表中检索记录和进行计数将变得缓慢且效率低下。我可以索引任一列,但我不知道它的效果如何。该网站拥有超过一百万个 cmets。
我正在使用 PHP 和 MySQL。对于这样一个拥有庞大数据库的系统,我应该如何设计一个 Like 系统,使其更加优化和稳定?
【问题讨论】:
-
您可能希望将 LIKE 系统设计为非实时的。以“正确”的方式设计表格,但不要实时阅读它们以获得即时的 LIKE 计数。每隔几分钟、几小时等更新一次计数。
-
@AgRizzo “正确”的设计方式应该是什么样的?
-
你的“天真”方式——即标准化。您需要知道哪个用户喜欢哪个评论,因此需要两列(至少):user_id 和 comment_id。
-
我认为这太宽泛了,而且基于意见,不适合 SO - 这里发布的答案已经引起了更多的讨论,而不是单一的问答对。正如 OP 指出的那样,这可以通过多种方式完成,并且探索所有选项将很困难。
-
@HPierce 我不太明白你的反对意见。当然有多种方法可以做到这一点。大多数事情可以通过不同的方式来完成。但是您自己完成此任务的最佳方法可能是此问题的答案之一。以不同方式完成此任务的答案也可以为未来的读者提供很好的参考。
标签: php mysql optimization database-design system-design