Sql Fowler的关系模式&x27;时间表达式

Sql Fowler的关系模式&x27;时间表达式,sql,orm,scheduling,recurrence,Sql,Orm,Scheduling,Recurrence,Martin Fowler为周期性任务的调度定义了一个优雅的对象模型,它很好地映射到OO代码。然而,将其映射到关系数据库模式以实现持久性是一件棘手的事情 有人能推荐一个schema+SQL组合来封装他描述的所有功能吗,特别是在第11页的图片中。相交和并集是相当明显的——其复杂性在于表示“时态表达式”,它采用可变参数,并且必须以不同的方式进行解释,然后将它们组合成“时态集” 明确地说,有许多方法可以表示关系数据库中重复事件的概念。我希望每个人的意见是如何映射这个特定的模型 一些可能的选择: 定义

Martin Fowler为周期性任务的调度定义了一个优雅的对象模型,它很好地映射到OO代码。然而,将其映射到关系数据库模式以实现持久性是一件棘手的事情

有人能推荐一个schema+SQL组合来封装他描述的所有功能吗,特别是在第11页的图片中。相交和并集是相当明显的——其复杂性在于表示“时态表达式”,它采用可变参数,并且必须以不同的方式进行解释,然后将它们组合成“时态集”

明确地说,有许多方法可以表示关系数据库中重复事件的概念。我希望每个人的意见是如何映射这个特定的模型

一些可能的选择:

  • 定义参数数量和使用的“元”表。难看,但可能有用。然而,可能只有有限数量的“时间表达”形式,因此它提供的极端灵活性可能太大了
  • 某种形式的表继承,由Postgres(可能还有其他)RBM支持

序列化参数列表并将结果存储在varchar()中不是一个解决方案,因为该方法阻止基于集合的查询:)

SQL是一种用于查询数据集合的语言。它不容易支持特定于域的逻辑操作的编码。换句话说,“要评估的规则”不是SQL中的数据类型。这是一个面向对象的概念,数据和逻辑都是对象实例的组件

因此,我想说,在SQL范式中,您最多可以存储365行,对应于一年中的几天,以及一个真/假值,用于判断相应的几天是否满足定期计划的标准。因此,您必须使用OO逻辑实现Fowler模型来进行计算,并存储结果365行

然后,当您需要知道“今天(或任何给定日期)是日程安排的一部分吗?”时,可以很容易地查找相应的行并检查true/false列。对于任何数据库来说,每年存储365行都是微不足道的


这可能看起来像作弊,但正如我所说的,SQL是关于数据集的,而不是逻辑。

我担心这个答案会有很多参考资料和很少实用的代码,我上次处理这个问题已经有一段时间了,但是

我认为你想在这里混合的两种技术是和

第一个用于评估规则等,第二个用于存储时态数据并在某个记录有效时进行评估。这两个领域都是相当大的研究领域,但您可以用普通SQL来完成大部分时态工作(前提是您的数据库具有良好的时间支持)。在SQL中,活动部分比较难,但至少有一些规则对此有所帮助。我不知道其他数据库的情况,但它们中的大多数都有规则/触发器/约束支持,可以转换为您需要的内容

活动数据库是可以使用规则对其存储的事实的更改作出反应的数据库。这些规则是用特定于实现的语言指定的,但日常讨论(ECA规则)是常见的。有关主动数据库系统的介绍,请阅读文章和。有关ECA规则的更多信息,请查看(页面顺序与o_0相反)和

事件处理是规则处理的一种特殊情况,处理如何处理复合事件并适当触发其操作。关于这一点的有趣读物是和。另请参阅该网站以及和维基百科的文章

时态数据库可以看作是一个能够理解时间的数据库,特别是两种特定的时间;有效时间和事务时间。记录的有效时间是该记录有效的时间段,而记录的事务时间是该记录出现在数据库中的时间段。作为一个很好的实用介绍,我推荐RichardT.Snodgrass的《如何使用SQL进行时态数据库》一书

Oterhwise,您可能想了解的关于时态数据库的所有内容都可以在一个相当全面的文档中阅读(我将从“时态数据库”条目开始),但要更快地开始,请查看更易于浏览和阅读的文档,以及发布部分已经(或曾经有…)的站点链接到该地区最著名的出版物

因此,现在您已经了解了这一切,您很快就会看到,第11页上的图像可以表示为复合事件,并且可以进行检测/评估,前提是您已经实现了复合事件检测器所需的适当子集,其余的可以表示为具有时间方面的表中的条目:)

马丁·福勒(Martin Fowler)在他的著作中阐述了这一点,其中总结了许多与时间有关的模式

最后,我可能会为时态信息创建一个数据库模式,并为活动部分使用DB规则,或者在应用程序中实现该部分(尽管有龙)。如果您使用PostgreSQL,部分文档中描述了规则机制

要读的东西很多,但如果你完全理解了这一切,你的职业净资产会上升很多:)


此外,谷歌的好术语是“时态数据库”、“活动数据库”、“ECA规则”。

谢谢你的想法。。。但我看到的一个紧迫问题是,无法重建用于生成日期集的规则。保存“每周一”将为您提供52(或53)个数据点,但加载这些点并不一定意味着“每周一”。建模时间会更好。有一年中的几天、一周的几天、几个月等的表格,所有表格都由一个时间id链接。然后,您可以使用这些表格上的选择来表示任何(基于日期的)规则。@Dmitri