实施评论和点赞系统(如 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万亿!我不相信他们会那样做设计。
- 我们思考的主要问题:如何才能设计出最适合大公司使用的设计结构? (Twitter、Instagram 等)(最少的查询执行、最优化等)
这就是我们的实际想法:
- 如果有人对 post 发表评论,JSON 将在评论栏中更新。这种方法是否比为每个评论或喜欢添加一个新行更有效?
- 我们找到了这个 class 图:
这个设计是在 2009 年分享的。如果我们做的是大项目,实现这个 schema 会不会给我们以后带来优化问题? (假设每个分享都有 100 万个赞和 100 万个评论。:))
编辑:我们正在设计为关系数据库。
对评论使用单独的 table。它将包含您指定的 5 列。
将东西放在 JSON 中会使它们难以获取、搜索、过滤等。对于任何类型的数组也是如此。您正在同时执行这两项操作——将 JSON 个对象的数组放在一个单元格中。
了解 JOIN
以重新连接我要您分开的东西。
要进入万亿,您还需要 'sharding'。但是,在您达到数百万之前,我们不要讨论这个问题。
(更多建议)
"large companies" 有一个跨越数百台服务器的 "sharded" 数据集。 Comments
很可能处于正常状态 table。 JSON不太可能被使用;尤其不是用于搜索或排序的任何内容。 JSON 适用于需要保存的杂项 kruft,但不适用于 searched/sorted。
真的很适合你
- 设计并实施某物(即使它包括JSON);
- 投产;
- 研究出现的问题;
- 几个月后重新设计 - 愿意丢弃大部分原始设计。
- "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的细节(因为软件将无法完全让你不需要学习细节)。
我们正在为课程项目设计数据库 (MySQL)。这正是我们所坚持的:评论和喜欢系统。 所以我们找到了这个问题:Implementing Comments and Likes in database
解释得很漂亮,也很准确。但是每个喜欢或评论都必须是一个新行。 Instagram 的“赞”按钮平均每天被点击约 45 亿次。这对于 likes
table 来说太大了。 4.5bx30天=每月135万亿!我不相信他们会那样做设计。
- 我们思考的主要问题:如何才能设计出最适合大公司使用的设计结构? (Twitter、Instagram 等)(最少的查询执行、最优化等)
这就是我们的实际想法:
- 如果有人对 post 发表评论,JSON 将在评论栏中更新。这种方法是否比为每个评论或喜欢添加一个新行更有效?
- 我们找到了这个 class 图: 这个设计是在 2009 年分享的。如果我们做的是大项目,实现这个 schema 会不会给我们以后带来优化问题? (假设每个分享都有 100 万个赞和 100 万个评论。:))
编辑:我们正在设计为关系数据库。
对评论使用单独的 table。它将包含您指定的 5 列。
将东西放在 JSON 中会使它们难以获取、搜索、过滤等。对于任何类型的数组也是如此。您正在同时执行这两项操作——将 JSON 个对象的数组放在一个单元格中。
了解 JOIN
以重新连接我要您分开的东西。
要进入万亿,您还需要 'sharding'。但是,在您达到数百万之前,我们不要讨论这个问题。
(更多建议)
"large companies" 有一个跨越数百台服务器的 "sharded" 数据集。 Comments
很可能处于正常状态 table。 JSON不太可能被使用;尤其不是用于搜索或排序的任何内容。 JSON 适用于需要保存的杂项 kruft,但不适用于 searched/sorted。
真的很适合你
- 设计并实施某物(即使它包括JSON);
- 投产;
- 研究出现的问题;
- 几个月后重新设计 - 愿意丢弃大部分原始设计。
- "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的细节(因为软件将无法完全让你不需要学习细节)。