database - 约束数据库

标签 database validation constraints etl

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

上下文:

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

  • 作用于一行。
  • 在一个表或不同表中行间执行。
  • 在两次运行之间以相同的方式运行(它应该对所有数据保持相同的约束,或者只对最后 n 次运行保持相同的约束);

第三种情况与第二种情况不同,因为它适用于第二种情况,但适用于明确定义的运行次数。它可能适用于单次运行(一个文件),或介于(1 到 n(前一个)或所有文件)之间。

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

对于第三种规则的应用,ETL需要有内存(我想我们最终会在ETL中备份数据);或者通过在某个时间窗口后对整个数据库无限地重新检查(一个作业),所以最终在数据库中的数据不一定及时满足第三种规则。

示例:

当我们有一个连续流动的数据时,我们应用约束来拥有一个完整的受限数据库,第二天我们将收到一个备份或更正数据,比如一个月,对于这个时间窗口,我们希望满足约束只有这次运行(这个时间窗口),而不用担心整个数据库,对于 future 的运行,所有数据都应该像以前一样受到限制,而不用担心过去的数据。您可以想象其他适合 Temporal logic 的规则.

目前,我们只实现了第一种规则。我的想法是拥有一个缩小的数据库(任何类型的:MySQL、PostgreSQL、MongoDB ...)来备份所有数据(仅受约束的列,可能具有散列值),并带有基于早期一致性的标志一种规则。

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

用 Cook 编程语言说明;一组规则和以下操作的示例:

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')

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

我真的希望这不是一个非常宽泛的问题,这是正确的地方。

最佳答案

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

现在有了这个实现,我们就绑定(bind)了 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 数据帧等。

来自官方文档:

The tdda.constraints library is used to discover constraints from a (Pandas) DataFrame, write them out as JSON, and to verify that datasets meet the constraints in the constraints file. It also supports tables in a variety of relation databases. There is also a command-line utility for discovering and verifying constraints, and detecting failing records.

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

我也开赏金来进一步丰富回复。

关于database - 约束数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58199623/

相关文章:

sql - 增加所有行的 FK 列值 SQL

javascript - 我的表单验证功能出了什么问题?

java - 方法参数的编译时验证

grails - Grails域类失败

ios - Xcode Swift 以编程方式将 UITextfield X 位置设置为中心

mysql - 什么是 Oracle 中 MySQL Set 数据类型的等价物?

c# - 删除行,重新播种非 PK 索引列? C#

MySQL 语法问题,多个 SELECT 语句

javascript - 使用 If 进行表单验证

mysql - 一对多可选关系