2009-05-18 4 views
2

Bezug auf this question, habe ich beschlossen, die Tabellen jedes Jahr zu verdoppeln, Erstellen von Tabellen mit den Daten des Jahres, so etwas wie, zum Beispiel:PostgreSQL: beste Weg, um neue zu erstellen/duplizieren vorhandenen Tabellen jedes Jahr

orders_2008 
orders_2009 
orders_2010 
etc... 

Nun, ich weiß, dass wahrscheinlich das Geschwindigkeitsproblem mit nur 2 Tabellen für jedes Element, wie orders_history und order_actual gelöst werden konnte, aber ich dachte, dass sobald der Handler-Code geschrieben wurde, wird es keinen Unterschied geben .. nur viele Tabellen .

Diese Tabellen werden sogar ein Kind mit Fremdschlüssel haben; zum Beispiel wird die orders_2008 das Kind items_2008 haben:

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; 

Also mein Problem ist: Was denken Sie, ist der beste Weg, diese Tabellen alle 1. Januar und, natürlich, halten die Tabellen Abhängigkeiten zu replizieren?

Ein PHP/Python-Skript, das nach Abfrage die Struktur für das neue Jahr neu erstellt (von einem Cron-Job aufgerufen)? Können die Funktionen von PostgreSQL auf diese Weise genutzt werden? Wenn ja, wie (ein kleines Beispiel wird nett sein)

Eigentlich gehe ich für den ersten Weg (eine .sql-Datei mit der Struktur, und ein PHP/Python-Skript von Cronjob geladen, die die Struktur neu aufbauen), aber ich frage mich, ob das der beste Weg ist.

bearbeiten: Ich habe gesehen, dass die Pgsql-Funktion CREATE TABLE LIKE, aber die Foreign-Schlüssel müssen in einem zweiten Mal hinzugefügt werden .. oder es wird die neuen Tabellen auf die alten Tabellen verweisen.

Antwort

5

PostgreSQL verfügt über eine Funktion, mit der Sie eine Tabelle erstellen können, die Felder aus einer anderen Tabelle erbt. Die Dokumentation finden Sie in their manual. Das könnte Ihren Prozess ein wenig vereinfachen.

1

Ich würde Orders und order_history empfehlen ... einfach die alten Orders regelmäßig in den Verlauf rollen, was jetzt ein schreibgeschütztes Dataset ist, also fügen Sie einen Index hinzu, der jede einzelne Suchanfrage berücksichtigt (wenn Ihre Datenstrukturen halbwegs anständig sind), bleiben Sie leistungsfähig.

Wenn Ihre Geschichtstabelle "zu groß" wird, ist es wahrscheinlich an der Zeit, über Data Warehousing nachzudenken ... was wirklich großartig ist, aber es ist sicherlich nicht billig.

+0

Ich habe ein Problem beim Verschieben von Daten in eine andere Tabelle: die Zuverlässigkeit. Ich habe eine Tabelle (mehr als eine), die die Zahlungsfähigkeit des Unternehmens speichern, automatisch ausgefüllt durch die Rechnungen und Zahlungsströme. Wenn ich alle ein Jahr alten Rechnung in der Verlaufstabelle verschiebe, dann sollte ich alle Leistungszeilen mit der Rechnungs-ID, die in der Verlaufstabelle gewährt wurde, aktualisieren. Ist nicht unmöglich, nur zart – Strae

1

Wie andere in Ihrer vorherigen Frage erwähnt haben, ist dies wahrscheinlich eine schlechte Idee. Das heißt, wenn Sie es so machen wollen, warum nicht einfach alle Tabellen im Voraus erstellen (sagen wir 2008-2050)?

4

Sie sollten sich Partitioning in Postgresql ansehen. Es ist die Standardmethode, um das zu tun, was Sie tun möchten. Es verwendet Vererbung wie John Downey vorgeschlagen.

3

Sehr schlechte Idee.

Werfen Sie einen Blick um Partitionierung und Ihre Augen auf Ihre eigentliche Ziel halten:

  • Sie nicht Tisch-Sets für jedes Jahr wollen, denn dies ist nicht Ihr Problem.Viele Systeme funktionieren perfekt ohne sie :)
  • Sie wollen einige Leistung und/oder Speicherplatz Probleme lösen.
Verwandte Themen