福勒时态表达的关系模式

时间:2008-11-22 06:40:30

标签: sql orm scheduling recurrence

Martin Fowler定义了一个优雅的对象模型,用于安排定期任务here,它非常好地映射到OO代码。但是,将此映射到关系数据库模式以实现持久性是很棘手的。

任何人都可以建议一个模式+ SQL组合来封装他描述的所有功能,特别是在第11页的图像中。相交和联合是相当明显的 - 复杂性在于表示“时间表达式”,它采用可变参数和必须以不同的方式解释,然后将它们组合成“时间集”。

要清楚,有很多方法可以表示关系数据库中重复事件的概念。我希望大家输入的是如何映射这个特定的模型。

一些可能的选择:

  • 'Meta'表定义参数的数量和使用。丑陋,但可能有效。然而,只有极少数的“时间表达”形式,所以它提供的极大灵活性可能太多了。
  • 某种形式的表继承,由Postgres(可能是其他)RBMS支持。

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

2 个答案:

答案 0 :(得分:24)

我担心这个答案会有很多参考资料和很少的实用代码,而且自从我上次搞砸了这个问题以来已经有一段时间了,但是......

我认为您想要混合的两种技术是'active databases''temporal databases'

第一个用于评估规则等等,第二个用于存储时态数据并在某个记录有效时进行评估。这两个都是相当大的研究领域,但你可以在普通的SQL中完成大部分时间内容(假设你的数据库有很好的时间支持)。活动部分在SQL中更难,但PostgreSQL至少有规则来帮助解决这个问题。我不知道其他数据库,但大多数都有规则/触发/约束支持,可以转换为你想要的。

活动数据库是可以使用规则对其存储的事实进行更改的数据库。这些规则在特定于实现的语言中指定,但对于每天的讨论,Event-Condition-Action rules(ECA规则)很常见。有关活动数据库系统的介绍,请阅读文章The Active Database Management System ManifestoActive Database Systems。有关ECA规则的更多信息,请查看Logical Events and ECA Rules(页面顺序相反o_0)和Events in an Active Object-Oriented Database System

事件处理是规则处理的一个特例,它处理如何处理复合事件并适当地触发它们的操作。关于此问题的有趣读物是Composite Events for Active Databases: Semantics, Contexts and DetectionAnatomy of a Composite Event Detector。另请参阅Complex Event Processing网站以及Event Stream ProcessingComplex Event Processing维基百科文章。

时态数据库可以看作是一个可以理解时间的数据库,特别是两种特定的时间;有效时间和交易时间。记录的有效时间是该记录有效的时间段,记录的事务时间是它在数据库中存在的时间。作为一个很好的实用介绍,我建议 一书介绍如何在SQL中使用时态数据库:{T {3}}作者:Richard T. Snodgrass。

OTERhwise,您可能想要了解的关于时态数据库的所有内容都可以在Developing Time-Oriented Database Applications in SQL中阅读,这是一个非常全面的文档(我将从'Temporal Database'条目开始),但要快点开始,查看更容易浏览和阅读的Temporal Database Entries for the Springer Encyclopedia of Database Systems,以及其出版物部分(或确实有...)链接到该地区最着名的出版物的网站Temporal Database Glossary

所以,既然您已经了解了这一切,那么您很快就可以看到第11页上的图像可以表示为复合事件,并且可以检测/评估这样的图像,前提是您已经实现了复合事件检测器的正确所需子集,其余部分可以表示为具有时间方面的表格中的条目:)

Martin Fowler在他的Time Center中解决了很多这个问题,总结了许多与时间有关的模式。

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

很多东西要读,但是如果你完全明白这一切,那么你的专业净资产可以上涨很多:)

此外,google的良好条款是“时态数据库”,“活跃数据库”,“ECA规则”。

答案 1 :(得分:2)

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

所以我想说你能做的最多在SQL范例中将存储365行,对应于一年中的几天,以及相应日期是否满足的真/假值经常性时间表的标准。因此,您必须使用OO逻辑实现Fowler的模型来进行计算,并存储生成的365行。

那么当你需要知道“今天(或任何特定日期)时间表的一部分?”查找相应的行并检查true / false列非常容易。对于任何数据库,每年存储365行都是微不足道的。

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