3

我正在启动一个 Django 项目,需要对可能包含太多行的多个表进行分片。我已经查看了这里和其他地方的线程,并遵循了 Django 多数据库文档,但我仍然不确定所有这些是如何缝合在一起的。我的模型有可能被分片破坏的关系,所以看起来选项是要么放弃对各自模型进行分片的外键。

出于争论的目的,考虑经典的 Authot、Publisher 和 Book 场景,但加入书籍副本和可以拥有它们的用户。假设书籍和用户必须被分片。你会怎么处理呢?用户可能拥有不在同一数据库中的书籍副本。

一般来说,您用于路由和分片本身的最佳实践是什么?您是否使用了 Django 数据库路由器,根据您的分片逻辑在命令中手动选择了一个数据库,或者重写了 ORM 的某些部分来实现这一点?

如果重要的话,我在 Ubuntu 上使用 PostgreSQL。

非常感谢。

4

2 回答 2

4

在过去,我使用 Postgresql Table Partitioning做过类似的事情,但这只是将表拆分到同一个数据库中。这有助于减少表搜索时间。这也很好,因为您不需要太多修改 django 代码。(确保使用用于约束的字段执行查询)。

但这不是分片。

如果您还没有看到它,您应该查看使用 Instagram 的 Sharding Postgres。

于 2012-11-29T08:06:10.657 回答
1

我同意@DanielRoseman。此外,多少行太多。如果你对索引很小心,你可以处理很多行而不会出现性能问题。保持索引值小(整数)。我有超过 4 亿行的表,即使在与其他数百万行表连接时也会产生亚秒级的响应。

将用户分成多个表可能更有意义,以便用户对象具有常用事物的核心,然后“配置文件”信息存在于其他地方(标准 Django 设置)。副本将是一个参考书籍的小表格,其中包含大量数据。考虑到这些天您可以在数据库服务器中放入多少内存,在您拥有之前进行分片似乎是错误的。

于 2012-11-30T05:25:10.947 回答