我想了解多个表的情况下的分片,这些表可能用于 Quora/SO 等 QnA 网站。假设用户可以提出问题、给出答案并对问题和答案发表评论。
假设我有 3 个表(问题、答案、评论),它们有这样的列:
假设我们正在对 Postgres 数据库进行分片。 现在我想优化查看包含单个问题以及所有答案及其评论的页面。
一种方法是根据“question_id”列拆分“questions”和“answers”表。这样,与特定问题相关的所有答案都存储在同一个分片中。
但是,在处理“评论”表时,我无法确保问题的每个答案的所有评论都存储在单个分片中(避免在获取问题页面的所有评论时需要多分片查询) 。按parent_id 进行分片不起作用,因为在这种情况下,对同一问题的不同答案的多个评论将具有不同的分片。
是否有更好的数据库设计可以让我不会遇到这个问题? 任何有关 Quora 或 SO 如何实际处理“评论”以避免/解决此问题的见解都将受到高度赞赏。
Comments
也需要进行分片。按 question_id
(或此类的哈希值)拆分所有 3 个表。这假设评论知道与其关联的 Question_id。
分片将允许您比没有分片处理更多的查询。但是,会有维护问题。
如果您的系统变得如此繁忙,以至于您需要更多的数据拆分,则可能需要一些停机时间才能将一些问题+答案+评论迁移到新分片。另一方面,由于问题随着时间的推移而变得陈旧,只需将新问题+答案+评论放在新服务器上,让旧服务器消失即可。
考虑到这一点,我建议您从单个分片开始,逐渐增长到更多分片。