Einschränkungsdatenbank

8

Ich kenne die Intuition hinter der Einschränkungsprogrammierung, sozusagen, ich habe die Programmierung mit einem Einschränkungslöser nie wirklich erlebt. Obwohl ich denke, dass es eine andere Situation ist, das erreichen zu können, was wir als konsistente Daten definieren würden.

Kontext:

Wir müssen eine Reihe von Regeln auf einem ETL-Server implementieren. Diese Regeln sind entweder:

  • auf eine Reihe einwirken.
  • Zwischenzeilen in einer oder mehreren Tabellen.
  • Gleiches Verhalten zwischen zwei Läufen (Es sollte die gleiche Einschränkung für alle Daten oder nur für die letzten n Läufe beibehalten).

Der dritte Fall unterscheidet sich vom zweiten, da er gilt, wenn der zweite Fall gilt, jedoch für eine genau definierte Anzahl von Läufen. Es kann für einen einzelnen Lauf (eine Datei) oder zwischen (1 bis n (vorherige) oder für alle Dateien) angewendet werden.

Technisch gesehen hat die ETL, wie wir sie konzipiert haben, keinen Speicher zwischen zwei Läufen: zwei Dateien (dies ist jedoch zu überdenken)

Für die Anwendung der dritten Art von Regel muss ETL über Speicher verfügen (ich denke, wir würden am Ende Daten in ETL sichern). Oder indem Sie nach einem bestimmten Zeitfenster die gesamte Datenbank unendlich (einen Job) erneut überprüfen, sodass Daten, die in der Datenbank landen, nicht unbedingt die dritte Art von Regel rechtzeitig erfüllen.

Beispiel:

Während wir kontinuierlich fließende Daten haben, wenden wir Einschränkungen an, um eine vollständige eingeschränkte Datenbank zu haben. Am nächsten Tag erhalten wir eine Sicherungs- oder Korrekturdaten für beispielsweise einen Monat. Für dieses Zeitfenster möchten wir, dass Einschränkungen nur für diese erfüllt werden run (dieses Zeitfenster), ohne sich um die gesamte Datenbank zu kümmern, für zukünftige Läufe sollten alle Daten wie zuvor eingeschränkt werden, ohne sich um vergangene Daten zu kümmern. Sie können sich andere Regeln vorstellen, die zur zeitlichen Logik passen könnten .

Im Moment haben wir nur die erste Art von Regeln implementiert. Die Art und Weise, wie ich es mir vorgestellt habe, ist eine minimierte Datenbank (jeglicher Art: MySQL, PostgreSQL, MongoDB ...), die alle Daten (nur eingeschränkte Spalten, wahrscheinlich mit Hash-Werten) mit Flags sichert, die sich auf die Konsistenz beziehen, die auf früher basiert Art von Regeln.

Frage: Gibt es Lösungen / Konzeptionsalternativen , die diesen Prozess vereinfachen würden?

In einer Cook-Programmiersprache zu veranschaulichen ; Ein Beispiel für eine Reihe von Regeln und folgenden Aktionen:

run1 : WHEN tableA.ID == tableB.ID AND tableA.column1 > tableB.column2
       BACK-UP 
       FLAG tableA.rule1
AFTER run1 : LOG ('WARN')

run2 : WHEN tableA.column1 > 0
       DO NOT BACK-UP 
       FLAG tableA.rule2
AFTER run2 : LOG ('ERROR')

Hinweis : Während Constraint-Programmierung theoretisch ein Paradigma zur Lösung kombinatorischer Probleme ist und in der Praxis die Problementwicklung und -ausführung beschleunigen kann; Ich denke, das ist etwas anderes als ein Problem zur Lösung von Einschränkungen. Da der erste Zweck nicht darin besteht, Einschränkungen vor der Auflösung zu optimieren, werden wahrscheinlich nicht einmal Datendomänen eingeschränkt. Das Hauptanliegen besteht darin, Regeln für den Datenempfang anzuwenden und einige grundlegende Aktionen auszuführen (Zeile ablehnen, Zeile akzeptieren, Protokollierung ...).

Ich hoffe wirklich, dass dies keine sehr breite Frage ist und dies der richtige Ort ist.

Curcuma_
quelle

Antworten:

3

Ich fand eine ausgefeilte Lösung, um mehr zu erreichen, als ich dachte. über die Überprüfung der Datenkonsistenz sprechen. Anscheinend würden wir dies als testgetriebene Datenanalyse bezeichnen

Mit dieser Implementierung sind wir nun an Python und Pandas gebunden, aber zum Glück nicht nur. Wir können sogar die Datenkonsistenz in MySQL-, PostgreSQL ... -Tabellen überprüfen.

Das Plus, über das ich nicht nachgedacht habe, ist, dass wir Regeln basierend auf Beispieldaten ableiten können. Dies kann beim Festlegen von Regeln hilfreich sein. Deshalb gibt es tdda.constraints.verify_dfund die tdda.constraints.discover_df.

Soweit ich darüber gelesen habe, wird keine Lösung zur Überprüfung der (schwächeren) Konsistenz der letzten (n) Dateien vorgeschlagen. Ich dachte darüber nach, dass wir die Konsistenz von Batchdateien nennen könnten, die nur für einige Sätze von Läufen (letzte n Läufe) und nicht für alle Daten eine Regelzufriedenheit gewährleistet. Es wirkt nur auf einzelne Dateien, es benötigt eine höhere Verkabelung, um (n) Dateien, die nacheinander ankommen, konditionieren zu können.

Weitere Informationen: https://tdda.readthedocs.io/en/latest/constraints.html#module-tdda.constraints

assertCSVFilesCorrect Überprüft eine Reihe von Dateien in einem Verzeichnis. Dies gilt auch für Pandas-Datenrahmen usw.

Aus der offiziellen Dokumentation:

Die Bibliothek tdda.constraints wird verwendet, um Einschränkungen aus einem (Pandas) DataFrame zu ermitteln, sie als JSON zu schreiben und zu überprüfen, ob Datasets die Einschränkungen in der Einschränkungsdatei erfüllen. Es unterstützt auch Tabellen in einer Vielzahl von Beziehungsdatenbanken. Es gibt auch ein Befehlszeilenprogramm zum Erkennen und Überprüfen von Einschränkungen und zum Erkennen fehlerhafter Datensätze.

ps: Ich bin immer noch offen für andere Lösungen. Lassen Sie es mich wissen, da ich mir vorstelle, dass dies ein Anwendungsfall für jede ETL-Lösung ist.

Ich eröffne auch ein Kopfgeld, um die Antworten weiter zu bereichern.

Curcuma_
quelle
2

Sie können auch in SQL schauen transactions. Eine Transaktion besteht aus einer oder mehreren Anweisungen, die von einem einzelnen Benutzer oder einer Anwendung ausgeführt werden sollen. Sie können Daten in einer Datenbank lesen oder sogar ändern.

START TRANSACTION
Do DB stuff, check if constraints are violated
COMMIT

Sie können bestimmte Einschränkungen angeben und verwenden, ROLLBACKwenn eine dieser Einschränkungen verletzt wird. Das Rollback kann vom Entwickler explizit codiert, aber auch aus dem System geworfen werden. (z. B. wenn ein Fehler aufgetreten ist, der vom Entwickler nicht explizit behandelt wird, oder wenn ein Trigger ausgeführt wird). Transaktionen stehen sich möglicherweise nicht im Weg. Sie müssen „isoliert“ ausgeführt werden. Mehrere gleichzeitige Transaktionen müssen in den Daten dieselben Ergebnisse liefern wie dieselben Transaktionen, die nacheinander in einer (nicht angegebenen) Reihenfolge ausgeführt werden. Da alle modernen DBMS ACID-Eigenschaften für Transaktionen garantieren, ist die Ausführung von Transaktionen zuverlässig, sodass der Status Ihrer Datenbank keine Inkonsistenzen aufweisen sollte.

Ich bin mir nicht sicher, ob du das meinst, aber vielleicht hilft es.

Psychotechnopath
quelle
Ich suchte nach einem fließenderen Weg, um Streams einzuschränken. In meinem Fall benötigen Transaktionen eine Menge Codierung, um die zeitliche Ankunft von Daten zu beschränken, denke ich. Trotzdem scheint es der beliebteste Weg in der Welt von SQL zu sein.
Curcuma_
1
Aha. Ich habe noch nie von einer fließenden Methode gehört, um neuere Datenströme lockerer einzuschränken als die Daten, die sich derzeit in Ihrer Datenbank befinden. AFAIK (zumindest in SQL-Systemen), Sie kümmern sich einmal um die Einschränkungsprogrammierung und stellen sicher, dass sie korrekt ausgeführt wird, damit Sie sich nicht erneut darum kümmern müssen. Dann ist die Datenbank bereits konsistent, und wenn neue Daten in Ihre Datenbank eingegeben werden, werden Einschränkungen automatisch überprüft und berücksichtigt. Sie müssen niemals die Konsistenz der gesamten Datenbank überprüfen, wenn n neue Elemente eingegeben werden. Nur für die n neuen Elemente werden Einschränkungen überprüft
Psychotechnopath