参考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键...或者它将保持新表的参考值。
答案 0 :(得分:5)
PostgreSQL有一项功能,可以让您创建一个继承另一个表中字段的表。文档可以在their manual中找到。这可能会简化您的流程。
答案 1 :(得分:4)
你应该看看Partitioning in Postgresql。这是做你想做的事情的标准方式。正如John Downey所建议的,它使用了继承。
答案 2 :(得分:3)
非常糟糕的主意。
浏览分区并密切关注您的真实目标:
答案 3 :(得分:1)
我建议订单和order_history ...只是定期将旧订单滚动到历史记录中,这是现在的只读数据集,因此您需要添加索引以满足您需要的每个查询,并且它应该(如果你的数据结构只有一半,那么仍然保持高效。
如果您的历史记录表开始变得“太大”,那么可能是时候开始考虑数据仓库......这真的很棒,但它肯定不便宜。
答案 4 :(得分:1)
正如您在上一个问题中提到的那样,这可能是一个坏主意。也就是说,如果你这样做就死定了,为什么不预先创建所有表格(比如说2008-2050)?