使用外键设置 Postgresql 分区

Vis*_*mar 7 postgresql foreign-key partitioning

我有一个安装了 PostgreSQL 9.1 的 Ubuntu 12.04 服务器。
我正在尝试在现有的 Postgres DB(比如“xyz”)上设置分区,它有非常大的表,有些表上设置了外键。

这就是我到目前为止所做的

  • 我按照http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html创建分区触发器。
  • 测试触发器,我插入的每个数据都放在正确的分区中。
  • 拿了采取pg_dump从DB“XYZ”的所有表的独立。为每个转储启用了
    该选项--column-inserts
  • 创建了一个新的数据库“xyz_new”。
  • 我在其中创建了导入的分区触发器和功能。
  • 开始导入没有外键的表。
  • 然后我导入了带有外键的表,外键引用的表已经导入。

但是在做最后一步时,我收到了一个错误,比如

ERROR: insert or update on table "aaaaa" violates foreign key constraint "bbbbb_id_refs_id_5b63fd27"
DETAIL: Key (bbbbb_id)=(6817) is not present in table "bbbbb".
结果,基于外键的表没有导入。

如果我在 bbbbb 上对 id 6817 执行 Select 查询,记录确实会显示出来。

然后在谷歌搜索之后我发现了这个,http://www.postgresql.org/docs/9.1/static/ddl-inherit.html
根据维基中提到的警告,继承不适用于外键。
(这对我来说是一个非常坏的消息 :( 我花了很多时间来创建触发器。)

现在,我想知道是否有一种解决方法可以使用外键管理 Postgres 上的分区?
或者
有没有其他方法可以处理带有外键的大表?

Chr*_*ers 11

首先,我建议阅读:http : //ledgersmbdev.blogspot.com/2012/08/postgresql-or-modelling-part-3-table.html因为虽然它不包括分区,但您正在使用表进行分区继承,这将涵盖很多细节。

一般来说,您可以通过三种方式处理此问题。第一种是使用专门的键表(用触发器管理)并在 fkey 约束中引用这些表。这通常是最简单的方法,但在某些情况下成本很高。

第二种可能性是您可以通过外键对连接表进行分区。这可能会导致严重的复杂性问题,因此除了极少数情况外,这是我最不喜欢的方法。

最后一种可能性是您可以编写自己的约束触发器来管理外键实施。

您选择哪种方法将取决于连接信息的复杂性,尤其是传递连接信息。第二种方法允许您以显着(可能是主要的)复杂性成本完全声明式地做事情,而第一种和第三种方法远离声明式方法,这意味着您可能还想使用 pgTAP 在触发器上运行测试用例...... .

这些解决方案都不是没有显着的复杂性。您可能需要重新考虑分区是否是最好的方法,以及部分索引和其他方法是否能让您到达需要的地方。