【发布时间】:2015-08-14 08:46:26
【问题描述】:
我有一个使用 Postgres 9.3 的 Django 1.7 项目。我有一张容量很大的桌子。该表每月将有 1300 万到 4000 万个新行。
我想知道将 Postgres 表分区与 Django 结合的最佳方式是什么?
【问题讨论】:
标签: django postgresql partitioning
我有一个使用 Postgres 9.3 的 Django 1.7 项目。我有一张容量很大的桌子。该表每月将有 1300 万到 4000 万个新行。
我想知道将 Postgres 表分区与 Django 结合的最佳方式是什么?
【问题讨论】:
标签: django postgresql partitioning
如果你使用的是新版本的 PostgreSQL,你可以试试这个
https://github.com/chaitin/django-pg-timepart
一个 Django 扩展,它实现了 PostgreSQL 表以根据日期进行分区和管理。
【讨论】:
您可以使用Architect 申请Postgresql Table Partitioning Django Project
PostgreSQL 在 Architect 中的分区实现是纯粹的 在数据库级别。这意味着 Architect 创建了几个 触发器和函数,并将它们直接插入到数据库中,所以 即使您从数据库控制台发出直接插入语句并且 不是来自 ORM,一切都会按预期工作,记录将是 插入正确的分区,如果分区不存在,则 将自动为您创建。也可以创建分区 以任何顺序,而不仅仅是从低到高。
这是旧Django DB Parti application的新版本
【讨论】:
只要您使用inheritance,然后只将父表连接到您的Django 模型,分区应该对Django 完全透明。也就是说,父表上的SELECT 将向下级联到分区,除非显式使用ONLY 关键字(如果适用)。
请注意,分区确实增加了复杂性,因为需要实施一种编程方法来确定何时需要创建新分区,然后创建它们——或者在特定时间间隔手动执行此操作。根据您的确切数据和业务逻辑,您很可能还需要实现 triggers 和 rules 来确定将INSERT 放入哪个分区(因为你不想INSERT 进入父表)。然而,这些也应该从 Django 中抽象出来。
我发现,根据具体情况,这可能需要在您的主要应用程序关闭时完成,以免新分区的创建导致死锁。
另外值得考虑的是您是否需要随着时间的推移创建真正的分区,或者如果表foo 和foo_archive 的继承模型就足够了,其中foo_archive 继承自foo,并且定期某些东西(例如脚本)将旧数据移动到 foo_archive 以保持 foo 更小。
【讨论】: