实施评论和点赞系统(如 Instagram 或 Twitter)的最佳方法

Best approach for implementing comments and likes system like Instagram or Twitter

我们正在为课程项目设计数据库 (MySQL)。这正是我们所坚持的:评论和喜欢系统。 所以我们找到了这个问题:Implementing Comments and Likes in database

解释得很漂亮,也很准确。但是每个喜欢或评论都必须是一个新行。 Instagram 的“赞”按钮平均每天被点击约 45 亿次。这对于 likes table 来说太大了。 4.5bx30天=每月135万亿!我不相信他们会那样做设计。

这就是我们的实际想法:

编辑:我们正在设计为关系数据库。

对评论使用单独的 table。它将包含您指定的 5 列。

将东西放在 JSON 中会使它们难以获取、搜索、过滤等。对于任何类型的数组也是如此。您正在同时执行这两项操作——将 JSON 个对象的数组放在一个单元格中。

了解 JOIN 以重新连接我要您分开的东西。

要进入万亿,您还需要 'sharding'。但是,在您达到数百万之前,我们不要讨论这个问题。

(更多建议)

"large companies" 有一个跨越数百台服务器的 "sharded" 数据集。 Comments 很可能处于正常状态 table。 JSON不太可能被使用;尤其不是用于搜索或排序的任何内容。 JSON 适用于需要保存的杂项 kruft,但不适用于 searched/sorted。

真的很适合你

  1. 设计并实施某物(即使它包括JSON);
  2. 投产;
  3. 研究出现的问题;
  4. 几个月后重新设计 - 愿意丢弃大部分原始设计。
  5. "Rinse and repeat"。要达到大公司经过十年和数十名工程师所达到的水平,要跨越的障碍太多了。

我一次只能帮你做一个迭代

喜欢...如果您要保留计数器,请在 'parallel' table 中进行。这将降低对主要 table 的争用。如果您要保留谁喜欢什么的列表,那么这本身就是一个 table。

IDs...不要在table 上使用AUTO_INCREMENT,PK 非常好。主要示例是任何 many:many table -- 使用两个 id 的组合。

规范化,但不要过度规范化。这是您将在我上面的 'step 3' 中开始理解的内容。

不要使用 EAV(实体-属性-值)模式设计。它 扩展性好。

子类化常常变得笨拙。在那个 link 中,他们有 Photo/Article/Place "is a" 实体。不。Photos 应该是它自己的 table,有自己的列、怪癖、索引等。

不要使用任何第 3 方软件。好的,您可以将其用于上述步骤的 first 迭代。但在第 4 步中,将其完全丢弃。到那时,你已经被迫学习MySQL的细节(因为软件将无法完全让你不需要学习细节)。