约束数据库

Constraint database

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

上下文:

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

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

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

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

示例:

虽然我们有一个连续流动的数据,但我们应用约束来拥有一个完整的受限数据库,第二天我们将收到一个备份或更正数据,比如说一个月,这次window,我们只想满足这个运行(这次window)的约束,而不用担心整个数据库,对于未来的运行,所有数据都应该像以前一样受到约束,而不用担心过去数据。你可以想象其他规则可以适合 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')

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

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

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

所以现在有了这个实现,我们绑定到 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 解决方案的用例。

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

您还可以查看 SQL transactions。事务由一个或多个语句组成,这些语句被要求由单个用户或应用程序执行。他们可以读取甚至修改数据库中的数据。

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

您可以指定某些约束并在违反其中一个约束时使用 ROLLBACK。回滚可以由开发人员显式编码,但可以 也从系统中抛出。 (例如,当出现开发人员未明确处理的错误时,或在执行触发器时)。交易不得相互妨碍。它们必须以“隔离”的方式执行。多个并发事务 必须在数据中产生与以某种(未指定)顺序顺序执行的相同事务相同的结果。由于所有现代 DBMS 在涉及事务时都保证 ACID 属性,因此事务的执行是可靠的,因此数据库的状态不应该有任何不一致。

不确定这是否是您的意思,但也许有帮助。