Martin Fowler 在这里为定期任务的调度定义了一个优雅的对象模型,它非常好地映射到OO代码.但是,将此映射到关系数据库模式以实现持久性是很棘手的.
任何人都可以建议一个模式+ SQL组合来封装他描述的所有功能,特别是在第11页的图像中.相交和联合是相当明显的 - 复杂性在于表示'时态表达式',它采用可变参数并且必须被解释不同的,然后将它们组合成'时间集'.
需要说明的是,有很多方法可以表示关系数据库中重复事件的概念.我希望大家输入的是如何映射这个特定的模型.
一些可能的选择:
'Meta'表定义参数的数量和使用.丑陋,但可能有效.但是,只有极少数的"时间表达"形式,因此它提供的极大灵活性可能太多了.
某种形式的表继承,由Postgres(以及可能是其他)RBMS支持.
序列化参数列表并将结果存储在varchar()中不是解决方案,因为该方法会阻止基于集合的查询:)
我担心这个答案会有很多参考文献和很少的实用代码,而且自从我上次搞砸了这个问题已经有一段时间了,但......
我认为这里要混合的两种技术是"活动数据库"和"时态数据库".
第一个对于评估规则等非常有用,第二个对于存储时态数据并在某个记录有效时进行评估非常有用.这两个都是相当大的研究领域,但你可以在普通的SQL中完成大部分时间内容(假设你的数据库有很好的时间支持).SQL中的活动部分更难,但PostgreSQL至少有一些规则来帮助解决这个问题.我不知道其他数据库,但大多数都有规则/触发/约束支持,可以转换为您正在寻找的.
活动数据库是可以使用规则对其存储的事实的更改做出反应的数据库.这些规则在特定于实现的语言中指定,但是对于每天的讨论,事件 - 条件 - 操作规则(ECA规则)是常见的.有关活动数据库系统的介绍,请阅读文章"活动数据库管理系统宣言"和" 活动数据库系统".有关ECA规则的更多信息,请查看逻辑事件和ECA规则(页面以相反的顺序O_0),并在Active面向对象的数据库系统事件.
事件处理是规则处理的一个特例,它处理如何处理复合事件并适当地触发它们的操作.关于这一点的有趣读物是活动数据库的复合事件:语义,上下文和检测以及复合事件检测器的剖析.另请参阅复杂事件处理站点以及事件流处理和复杂事件处理维基百科文章.
时态数据库可以看作是一个可以理解时间的数据库,特别是两种特定的时间; 有效时间和交易时间.记录的有效时间是该记录有效的时间段,记录的事务时间是它在数据库中存在的时间.作为一个很好的实用介绍,我建议阅读有关如何在SQL中使用时态数据库的书:Richard T. Snodgrass 在SQL中开发面向时间的数据库应用程序.
Oterhwise,一切你有可能会想知道时间的数据库可以读时态数据库条目的数据库系统的施普林格百科全书这是一个非常全面的文件(我将在"时态数据库"条目开始),但上手有点快,退房时态数据库术语这是相当轻松地浏览和阅读,而该网站的时间中心,其出版物部分具有(或确实有......)链接到该地区最显着的出版物.
所以,现在大家都知道这一点,你看很快,第11页上的图像可以表示为一个复合事件,并且可以检测/评估为这样的前提是你已经实现了复合事件检测器的正常所需的子集,该休息可以表示为具有时间方面的表中的条目:)
Martin Fowler在他的模式中解决了大部分内容,这些模式随着时间的推移而变化,总结了许多涉及时间的模式.
最后,我可能会创建时间信息的数据库架构,要么(虽然有怪物)使用DB规则为活动部分或实现应用程序的一部分.如果您使用PostgreSQL,则规则机制将在文档的规则系统部分中进行描述.
很多东西要读,但如果你彻底了解这一切,你的专业净值可以上升很多:)
此外,谷歌的好条款是'时间数据库','活跃数据库','ECA规则'.