约束数据库

Cur*_*ma_ 8 database validation etl constraints

我知道约束编程背后的直觉,可以说我从未真正体验过使用约束求解器进行编程。尽管我认为能够获得我们定义为一致数据的情况是不同的情况。

内容:

我们有一组要在ETL服务器上实现的规则。这些规则是:

  • 一排。
  • 行在一个或多个表中。
  • 在两次运行之间的行为方式相同(它应该对所有数据保持相同的约束,或者仅对最后n次运行);

第三种情况与第二种情况不同,它在第二种情况成立时适用,但运行次数已明确定义。它可能适用于单次运行(一个文件),或之间(1到n(先前)或在所有文件上)。

从技术上讲,正如我们所构思的ETL一样,它在两次运行之间没有内存:两个文件(但这需要重新考虑)

对于第三种规则的应用,ETL需要具有内存(我认为我们将最终备份ETL中的数据)。或在某个时间段后通过对整个数据库进行无限次重新检查(一个作业),因此最终存储在数据库中的数据不一定能及时满足第三种规则。

例:

当我们有连续的数据流时,我们将约束应用于整个约束数据库,第二天我们将收到一个月的备份或更正数据,对于这个时间范围,我们希望仅对此满足约束运行(此时间窗口),而不用担心整个数据库,对于将来的运行,所有数据都应像以前一样受到约束,而不必担心过去的数据。您可以想象其他符合时态逻辑的规则。

目前,我们只实施了第一类规则。我认为它的方式是拥有一个缩小的数据库(任何类型的数据库:MySQL,PostgreSQL,MongoDB ...),该数据库备份所有数据(仅包含受约束的列,可能带有散列值),并带有基于早期基于一致性的标志一种规则。

问题:是否有任何解决方案/概念替代方案可以简化此过程?

为了说明在库克的编程语言; 一组规则和以下操作的示例:

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')
Run Code Online (Sandbox Code Playgroud)

注意:虽然约束编程理论上是解决组合问题的范例,但实际上可以加快问题的开发和执行;我认为这与约束解决问题有所不同。由于第一个目的不是在解决之前优化约束,所以可能甚至没有限制数据域。主要关心的是在数据接收上应用规则并执行一些基本操作(拒绝行,接受行,记录...)。

我真的希望这不是一个很广泛的问题,这是正确的地方。

Cur*_*ma_ 4

我找到了一个复杂的解决方案,可以实现比我想象的更多的效果;谈论检查数据一致性。显然这就是我们所说的测试驱动数据分析

现在,通过这个实现,我们绑定了 Python 和 Pandas,但幸运的是,不仅如此。我们甚至可以检查 MySQL、PostgreSQL……表中的数据一致性。

我没有想到的一个好处是我们可以根据样本数据推断规则。这可能有助于制定规则。这就是为什么有tdda.constraints.verify_dftdda.constraints.discover_df

据我了解,它没有提出检查最后(n)个文件的(较弱)一致性的解决方案。我想到我们可以称之为批处理文件一致性,这仅确保某些运行集(最后 n 次运行)而不是所有数据的规则满足。它仅作用于单个文件,它需要更高级别的连接才能调节连续到达的 (n) 个文件。

欲了解更多信息: https://tdda.readthedocs.io/en/latest/constraints.html#module-tdda.constraints

assertCSVFilesCorrect检查目录中的一组文件,Pandas 数据帧等也是如此。

来自官方文档:

tdda.constraints 库用于从 (Pandas) DataFrame 中发现约束,将其写为 JSON,并验证数据集是否满足约束文件中的约束。它还支持各种关系数据库中的表。还有一个命令行实用程序用于发现和验证约束以及检测失败记录。

ps:我仍然对其他解决方案持开放态度,请告诉我,因为我认为这是任何 ETL 解决方案的用例。

我还提供赏金以进一步丰富回复。