Ich habe ein bisschen eine "upsert" Art von Frage ... aber ich will es rauswerfen, weil es ein bisschen anders ist als alle, die ich gelesen habe Paketüberfluss.Wie kann ich feststellen, ob sich der Datensatz in Postgres geändert hat?
Grundproblem.
Ich arbeite an der Migration von MySQL zu PostgreSQL 9.1.5 (auf Heroku gehostet). Als Teil davon muss ich jeden Tag mehrere CSV-Dateien importieren. Einige der Daten sind Verkaufsinformationen und sind fast garantiert neu und müssen eingefügt werden. Aber andere Teile der Daten sind fast garantiert identisch. Zum Beispiel enthalten die CSV-Dateien (Anmerkung Plural) POS (Point of Sale) Informationen in ihnen. Dies ändert sich selten (und ist höchstwahrscheinlich nur über Ergänzungen). Dann gibt es Produktinformationen. Es gibt ungefähr 10.000 Produkte (die überwiegende Mehrheit wird unverändert bleiben, aber es ist möglich, sowohl Ergänzungen als auch Aktualisierungen zu haben).
Der letzte Punkt (aber wichtig) ist, dass ich eine Anforderung haben muss, um einen Audit-Trail/Informationen für einen bestimmten Artikel bereitzustellen. Zum Beispiel, wenn ich einen neuen POS-Datensatz hinzufüge, muss ich in der Lage sein, diesen zurück zu der Datei zu verfolgen, in der er gefunden wurde. Wenn ich einen UPC-Code oder eine Beschreibung eines Produktes ändere, muss ich es zurückverfolgen können zum Import (und zur Datei), woher die Änderung kam.
Lösung, die ich erwäge.
Da mir die Daten per CSV zur Verfügung gestellt werden, arbeite ich daran, 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. Endgültiges Ziel). Also kopiere ich sie in Tabellen im Staging-Schema, die mit der CSV übereinstimmen (Anmerkung: ein Schema pro Datenquelle). Die Tabellen in den Staging-Schemas haben eine Trigger-Zeile vor dem Einfügen. Diese Trigger können entscheiden, was mit den Daten geschehen soll (Einfügen, Aktualisieren oder Ignorieren).
Für die Tabellen, die am wahrscheinlichsten neue Daten enthalten, wird zuerst versucht, sie einzufügen. Wenn der Datensatz bereits vorhanden ist, wird NULL zurückgegeben (und die Einfügung in die Staging-Tabelle wird angehalten). Bei Tabellen, die sich nur selten ändern, wird die Tabelle abgefragt und überprüft, ob der Datensatz gefunden wurde. Wenn dies der Fall ist, muss ich herausfinden, ob eines der Felder geändert wurde. (weil erinnern, ich muss zeigen, dass der Datensatz wurde durch den Import x aus der Datei y geändert) Ich kann natürlich nur Kessel den Code ausplattieren und jede Spalte testen. Aber, war auf der Suche nach etwas, das ein wenig "eloquenter" und haltbarer als das ist.
In gewisser Weise kombiniere ich ein importierendes System mit einem Audit-Trail-System. Bei der Untersuchung von Prüfpfaden habe ich den folgenden Artikel überprüft: wiki.postgresql.org. Es scheint, als ob der H-Store eine nette Möglichkeit wäre, Änderungen zu erhalten (und einige Spalten in der Tabelle leicht ignorieren zu können - zB "last_modified")
Ich bin zu 90% sicher, dass es alles geben wird Arbeit ... Ich habe ein paar Testtische erstellt und damit herumgespielt.
Meine Frage?
Ist eine bessere, wartungsfreundlichere Art, diese Aufgabe zu erledigen, die vielleicht 3 Datensätze aus 10K zu finden, die eine Änderung der Datenbank erfordern. Ich könnte sicherlich ein Python-Skript (oder etwas anderes) schreiben, das die Datei liest und versucht, herauszufinden, was mit jedem Datensatz zu tun ist, aber das fühlt sich schrecklich ineffizient an und wird zu vielen Rundreisen führen.
Ein paar letzten 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.
- er System wird wachsen und neue Datenquellen werden wahrscheinlich hinzugefügt werden, die die Menge der zu verarbeitenden Daten stark erhöhen wird (so versuche ich, die Dinge effizient zu halten)
- Ich weiß, das ist nicht schön, einfach SO Frage (wie "wie eine Liste in Python zu sortieren"), aber ich glaube, eine der großen Dinge über SO ist, dass Sie harte Fragen stellen können und die Leute ihre Gedanken darüber teilen, wie sie denken, der beste Weg, um es zu lösen ist.
Zwei (letzte) Fragen: 1) haben Sie löscht, oder ist der Eingang "inkrementell"? 2) Können die Anbieter der Daten * stabile Schlüssel * (keine Schlüsselaktualisierungen) garantieren? – wildplasser
Es ist verschieden mit der Datenquelle und dem Datentyp. Es ist definitiv eine Situation, in der ich beim Umgang mit den Daten wahrscheinlich "defensiv" sein und auf alles vorbereitet sein sollte.Das heißt, ich denke, ich hätte löschen können (aber selten) und ich glaube, dass die Schlüssel * stabil sein sollten (mit anderen Worten, die ID für den POS-Datensatz sollte zwischen Uploads gleich bleiben). –