PostgreSQL表分区Django项目

12

我有一个使用Postgres 9.3的Django 1.7项目。我有一张表将会有相当大的数据量,每个月会有1300万到4000万行新数据。

我想知道如何最好地将Postgres表分区与Django结合使用?

3个回答

19
您可以使用Architect应用程序进行Postgresql表分区Django项目。在Architect中,PostgreSQL的分区实现完全是在数据库层面上完成的。这意味着Architect会创建多个触发器和函数,并将它们直接插入到数据库中,因此即使您从数据库控制台而不是从ORM发出直接插入语句,一切也将按预期工作,并且记录将被插入到正确的分区中,如果分区不存在,则会自动为您创建分区。此外,分区可以按任意顺序创建,而不仅仅是从低到高。这是旧版Django DB Parti应用程序的新版本

所以这是正确的,但它似乎并没有创建分区表,因此添加索引似乎无法流入子表中。 - Kevin Parker
更新,PostgreSQL在版本12中支持良好的分区功能,因此您应该升级到该版本。 - Kevin Parker

8
只要您使用继承,然后只需将父表连接到您的Django模型,分区应该对Django完全透明。也就是说,对父表的SELECT将级联到分区,除非显式使用ONLY关键字(如果适用)。
请注意,分区确实增加了复杂性,需要实现编程方法来确定何时需要创建新分区,然后创建它们 - 或者在某些间隔手动执行此操作。根据您的确切数据和业务逻辑,很可能您还需要实现触发器规则来确定将某些内容INSERT到哪个分区(因为您不想INSERT到父表中)。但这些也应该从Django中抽象出来。
我发现,根据具体情况,这可能需要关闭主应用程序,以免新分区创建导致死锁。

还值得考虑的是,您是否需要随着时间推移创建真正的分区,或者是否可以使用继承模型,例如表foofoo_archive,其中foo_archive继承自foo,并且定期将旧数据移动到foo_archive中以保持foo较小。


2
如果您正在使用较新版本的PostgreSQL,您可以尝试这个: https://github.com/chaitin/django-pg-timepart 这是一个Django扩展,它实现了基于日期的分区和管理的PostgreSQL表。最初的回答来自引用中的描述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接