Feststellen, ob sich der Datensatz in Postgres geändert hat

Ich habe ein bisschen eine Art "Upsert" -Frage ... aber ich möchte es da rausschmeißen, weil es ein bisschen anders ist als alle, die ich über Stackoverflow gelesen habe.

Grundlegendes Problem.

Ich arbeite an der Umstellung von MySQL auf PostgreSQL 9.1.5 (gehostet auf Heroku). Dazu muss ich jeden Tag mehrere CSV-Dateien importieren. Bei einigen Daten handelt es sich um Verkaufsinformationen, die fast immer neu sind und eingefügt werden müssen. Es ist jedoch fast garantiert, dass andere Teile der Daten gleich sind. Zum Beispiel enthalten die CSV-Dateien (Note Plural) POS-Informationen (Point of Sale). Dies ändert sich selten (und ist höchstwahrscheinlich nur über Ergänzungen möglich). Dann gibt es Produktinformationen. Es gibt ungefähr 10.000 Produkte (die überwiegende Mehrheit bleibt unverändert, es können jedoch sowohl Ergänzungen als auch Aktualisierungen vorgenommen werden).

Der letzte Punkt (aber wichtig) ist, dass ich in der Lage sein muss, einen Audit-Trail / Informationen für einen bestimmten Punkt bereitzustellen. Wenn ich beispielsweise einen neuen POS-Datensatz hinzufüge, muss ich in der Lage sein, diesen in der Datei nachzuverfolgen, in der er gefunden wurde. Wenn ich einen UPC-Code oder eine Beschreibung eines Produkts ändere, muss ich in der Lage sein, ihn zurückzuverfolgen zu dem Import (und der Datei), von dem die Änderung stammt.

Lösung, die ich erwäge.

Da die Daten mir über CSV zur Verfügung gestellt werden, arbeite ich an der Idee, dass COPY der beste / schnellste Weg ist. Die Struktur der Daten in den Dateien ist nicht genau das, was ich in der Datenbank habe (d. H. Endziel). Ich kopiere sie also in Tabellen im Staging-Schema, die mit der CSV übereinstimmen (Anmerkung: ein Schema pro Datenquelle). Die Tabellen in den Staging-Schemata haben vor dem Einfügen Zeilentrigger. Diese Trigger können entscheiden, was mit den Daten geschehen soll (Einfügen, Aktualisieren oder Ignorieren).

Bei den Tabellen, die am wahrscheinlichsten neue Daten enthalten, wird zuerst versucht, diese einzufügen. Wenn der Datensatz bereits vorhanden ist, wird NULL zurückgegeben (und die Einfügung in die Staging-Tabelle gestoppt). Bei Tabellen, die sich selten ändern, wird die Tabelle abgefragt und geprüft, ob der Datensatz gefunden wurde. Wenn dies der Fall ist, muss überprüft werden, ob eines der Felder geändert wurde. (Weil ich daran denken muss, dass der Datensatz durch den Import von x aus der Datei y geändert wurde.) Ich kann natürlich einfach den Code auslesen und jede Spalte testen. Aber ich war auf der Suche nach etwas "beredterem" und wartungsfreundlicherem.

In gewisser Weise kombiniere ich ein importierendes System mit einem Audit-Trail-System. Deshalb habe ich bei der Suche nach Prüfpfaden Folgendes überprüftwiki.postgresql.org Artikel. Es scheint, als wäre der hstore eine gute Möglichkeit, Änderungen zu erhalten (und in der Lage zu sein, einige Spalten in der Tabelle, die nicht wichtig sind, einfach zu ignorieren - z. B. "last_modified").

Ich bin mir zu 90% sicher, dass alles funktionieren wird ... Ich habe einige Testtische usw. erstellt und damit herumgespielt.

Meine Frage?

Ist eine bessere, besser zu wartende Methode, um diese Aufgabe zu erfüllen und die drei Datensätze von 10 KB zu finden, für die eine Änderung der Datenbank erforderlich ist. Ich könnte sicherlich ein Python-Skript (oder etwas anderes) schreiben, das die Datei liest und versucht, herauszufinden, was mit den einzelnen Datensätzen geschehen soll, aber das fühlt sich schrecklich ineffizient an und führt zu vielen Roundtrips.

Ein paar letzte Dinge:

Ich habe keine Kontrolle über die Eingabedateien. Ich würde es lieben, wenn sie mir nur die Deltas schicken würden, aber sie tun es nicht und es liegt völlig außerhalb meiner Kontrolle oder meines Einflusses.Das System wächst und es werden wahrscheinlich neue Datenquellen hinzugefügt, die die Menge der verarbeiteten Daten erheblich erhöhen.Ich weiß, das ist keine nette, einfache SO-Frage (wie man eine Liste in Python sortiert), aber ich glaube, eines der großartigen Dinge an SO ist, dass man harte Fragen stellen kann und die Leute ihre Gedanken darüber teilen, wie sie das denken beste Weg, um es zu lösen, ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage