【问题标题】:PostgreSQL: best way to create new/duplicate existing tables every yearPostgreSQL:每年创建新表/重复现有表的最佳方式
【发布时间】:2009-05-18 12:12:38
【问题描述】:

参考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,但是必须在第二次添加外键......否则它将保持新表引用到旧表。

【问题讨论】:

    标签: php postgresql database


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您应该查看Partitioning in Postgresql。这是做你想做的事的标准方式。它使用 John Downey 建议的继承。

      【讨论】:

        【解决方案3】:

        非常糟糕的主意。

        查看分区并密切关注您的真正目标

        • 想要每年都设置表格,因为这不是您的问题。没有它们,许多系统都可以正常工作:)
        • 想要解决一些性能和/或存储空间问题

        【讨论】:

          【解决方案4】:

          我推荐orders和order_history...只是定期将旧订单滚动到历史记录中,现在这是一个只读数据集,所以你添加一个索引来满足你需要的每一个查询,它应该(如果你的数据结构还不错)保持高性能。

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

          【讨论】:

          • 我在将数据移动到另一个表时遇到问题:可连接性。我有一张表(不止一张),用于存储公司的可联系性,由发票和付款流程自动填充。如果我在历史表中移动所有一年前的发票,那么我应该使用历史表上授予的发票 ID 更新所有可联系性行。不是不可能,只是微妙
          【解决方案5】:

          正如其他人在您之前的问题中提到的那样,这可能是一个坏主意。也就是说,如果您一心想要这样做,为什么不预先创建所有表格(比如 2008-2050)?

          【讨论】:

            猜你喜欢
            • 2011-01-28
            • 1970-01-01
            • 2012-02-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-18
            • 2020-10-30
            相关资源
            最近更新 更多