对没有公共列的多个表进行分片

问题描述 投票:0回答:1

我想了解多个表的情况下的分片,这些表可能用于 Quora/SO 等 QnA 网站。假设用户可以提出问题、给出答案并对问题和答案发表评论。

假设我有 3 个表(问题、答案、评论),它们有这样的列:

  1. 问题 -> Question_id、user_id、文本、时间戳
  2. answers ->answer_id、user_id、question_id、text、timestamp(将来可以以不同方式扩展,因此为问题和答案保留单独的表)
  3. comments -> comment_id、user_id、parent_id、parent_type(具有 2 个值的枚举:“问题”、“答案”)、时间戳

假设我们正在对 Postgres 数据库进行分片。 现在我想优化查看包含单个问题以及所有答案及其评论的页面。

一种方法是根据“question_id”列拆分“questions”和“answers”表。这样,与特定问题相关的所有答案都存储在同一个分片中。

但是,在处理“评论”表时,我无法确保问题的每个答案的所有评论都存储在单个分片中(避免在获取问题页面的所有评论时需要多分片查询) 。按parent_id 进行分片不起作用,因为在这种情况下,对同一问题的不同答案的多个评论将具有不同的分片。

是否有更好的数据库设计可以让我不会遇到这个问题? 任何有关 Quora 或 SO 如何实际处理“评论”以避免/解决此问题的见解都将受到高度赞赏。

我看过的资源: SO 模式 quora 的分片

database-design sharding system-design
1个回答
0
投票

Comments
也需要进行分片。按
question_id
(或此类的哈希值)拆分所有 3 个表。这假设评论知道与其关联的 Question_id。

分片将允许您比没有分片处理更多的查询。但是,会有维护问题。

如果您的系统变得如此繁忙,以至于您需要更多的数据拆分,则可能需要一些停机时间才能将一些问题+答案+评论迁移到新分片。另一方面,由于问题随着时间的推移而变得陈旧,只需将新问题+答案+评论放在新服务器上,让旧服务器消失即可。

考虑到这一点,我建议您从单个分片开始,逐渐增长到更多分片。

© www.soinside.com 2019 - 2024. All rights reserved.