PostgreSQL: Her yıl mevcut / yeni tablolar oluşturmak çoğaltmak için en iyi yolu

5 Cevap php

this question atıfta, ben örneğin, yılın verileri ile tablolar oluşturma, her yıl tabloları çoğaltmak için bir şey gibi karar verdim:

orders_2008
orders_2009
orders_2010
etc...

Eh, muhtemelen hız sorunu orders_history ve order_actual gibi her element için sadece 2 tablolar ile çözülebilir olduğunu biliyorum, ama ben işleyici kod yazdılar, bir kez .. sadece birçok tablolar hiçbir fark olacağını düşündüm.

Those tables will have even some child with foreign key; for example the orders_2008 will have the child 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;

Yani, benim sorun: Bir tablo bağımlılıkları tutarak, elbette, ne bu tabloları çoğaltmak için en iyi yolu her 1 Ocak olduğunu düşünüyorum musunuz?

A PHP/Python script that, query after query, rebuild the structure for the new year (called by a cron job)? Can the PostgreSQL's functions be used in that way? If yes, how (an little example will be nice)

Aslında ben ilk yolu (yapısını içeren bir. Sql dosyası ve yapısını yeniden inşa cronjob tarafından yüklenen bir php / python komut dosyası) için gidiyorum, ama bu en iyi yol olup olmadığını merak ediyorum.

edit: Ben pgsql işlevi GİBİ tablo oluşturmak gördüm, ama Foreigns tuşlarına ikinci kez ilave edilmelidir .. yoksa o eski bir tot referencied yeni tablolar devam edecektir.

5 Cevap

PostgreSQL Başka bir tablodan alanları devralan bir tablo oluşturmak sağlayan bir özelliği vardır. Belgeler bulunabilir their manual. Bu senin sürecini biraz basitleştirmek olabilir.

Sen Partitioning in Postgresql bakmak gerekir. Bu ne yapmak istediğinizi yapmanın standart yoludur. John Downey önerilen gibi miras kullanır.

Çok kötü bir fikir.

Bölümleme etrafına bir göz ve keep your eyes on your real goal:

  • Bu senin sorunun değil çünkü don't, her yıl için masa setleri istiyorum. Sistemlerinin çok onlar olmadan mükemmel çalışıyor :)
  • Sen want to solve bazı performans ve / veya depolama alanı issues.

Ben sadece periyodik (size gereken her sorgu karşılamak üzere bir dizin eklemek yani, şimdi salt okunur veri seti olan, tarihe, eski siparişleri rulo, ve olması gerektiği ... emir ve order_history tavsiye ederim eğer veri yapıları) performanslısı kalır yarım terbiyeli.

Lütfen geçmiş tablo almaya başlarsa muhtemelen veri ambarı ... gerçekten muhteşem düşünmeye başlamanın zamanı geldi, ama kesinlikle ucuz değil "çok büyük".

Önceki soruda bahsettiğim diğerleri gibi, bu muhtemelen kötü bir fikir. Yani bunu bu şekilde yapıyor ölü kümesi ise, neden sadece (2008-2050 diyelim) ön tüm tabloları oluşturmak değil, dedi?