PostgreSQL:每年创建新/重复现有表的最佳方式

时间:2009-05-18 12:12:39

标签: php postgresql database

参考this question,我决定每年复制表格,创建包含年度数据的表格,例如:

orders_2008
orders_2009
orders_2010
etc...

嗯,我知道速度问题可能只用每个元素的2个表来解决,比如orders_history和order_actual,但我认为一旦编写了处理程序代码,就没有区别了......只是很多表

那些桌子甚至会有一些带外键的孩子; 例如,orders_2008将具有子items_2008:

CREATE TABLE orders_2008 (
    id serial NOT NULL,
    code character(5),
    customer text
);

ALTER TABLE ONLY orders_2008
    ADD CONSTRAINT orders_2008_pkey PRIMARY KEY (id);

CREATE TABLE items_2008 (
    id serial NOT NULL,
    order_id integer,
    item_name text,
    price money
);

ALTER TABLE ONLY items_2008
    ADD CONSTRAINT items_2008_pkey PRIMARY KEY (id);

ALTER TABLE ONLY items_2008
    ADD CONSTRAINT "$1" FOREIGN KEY (order_id) REFERENCES orders_2008(id) ON DELETE CASCADE;

所以,我的问题是:你认为每个1月1日复制这些表的最佳方法是什么,当然还有保持表依赖性?

一个PHP / Python脚本,在查询后查询,重建新年的结构(由cron作业调用)? PostgreSQL的功能可以这样使用吗? 如果是,那怎么样(一个小例子会很好)

实际上我是第一种方式(包含结构的.sql文件,以及重建结构的cronjob加载的php / python脚本),但我想知道这是否是最佳方式。

编辑我已经看到了pgsql函数CREATE TABLE LIKE,但是必须在第二次添加foreigns键...或者它将保持新表的参考值。

5 个答案:

答案 0 :(得分:5)

PostgreSQL有一项功能,可以让您创建一个继承另一个表中字段的表。文档可以在their manual中找到。这可能会简化您的流程。

答案 1 :(得分:4)

你应该看看Partitioning in Postgresql。这是做你想做的事情的标准方式。正如John Downey所建议的,它使用了继承。

答案 2 :(得分:3)

非常糟糕的主意。

浏览分区并密切关注您的真实目标

  • 希望每年都有表格集,因为这不是您的问题。如果没有它们,许多系统都能正常运行:)
  • 想要解决某些性能和/或存储空间问题

答案 3 :(得分:1)

我建议订单和order_history ...只是定期将旧订单滚动到历史记录中,这是现在的只读数据集,因此您需要添加索引以满足您需要的每个查询,并且它应该(如果你的数据结构只有一半,那么仍然保持高效。

如果您的历史记录表开始变得“​​太大”,那么可能是时候开始考虑数据仓库......这真的很棒,但它肯定不便宜。

答案 4 :(得分:1)

正如您在上一个问题中提到的那样,这可能是一个坏主意。也就是说,如果你这样做就死定了,为什么不预先创建所有表格(比如说2008-2050)?