sql - Fowler 时间表达式的关系模式

标签 sql orm scheduling recurrence

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

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

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

一些可能的选择:

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

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

    最佳答案

    恐怕这个答案会有很多引用资料和很少的实用代码,自从我上次弄乱这个已经有一段时间了,但是......
    我认为你想在这里混合的两种技术是 'active databases''temporal databases' .
    第一个对于评估规则等很有用,第二个对于存储时间数据并在某个记录有效时进行评估很有用。这两个都是相当大的研究领域,但是您可以在普通 SQL 中完成大部分时间性工作(前提是您的数据库具有良好的时间支持)。 SQL 中的事件部分更难,但 PostgreSQL至少有规则可以稍微帮助一下。我不知道其他数据库,但它们中的大多数都有规则/触发器/约束支持,可以转换为您正在寻找的内容。
    事件数据库 是可以使用规则对其存储的事实的变化使用react的数据库。这些规则以实现特定的语言指定,但用于日常讨论 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 .
    事件处理 是规则处理的一个特例,处理如何处理复合事件并适本地触发它们的 Action 。一个有趣的读物是 Composite Events for Active Databases: Semantics, Contexts and DetectionAnatomy of a Composite Event Detector .另见 Complex Event Processing网站和 Event Stream ProcessingComplex Event Processing维基百科文章。
    时态数据库 可以看作是一个可以理解时间的数据库,特别是两种特定的时间;有效时间和交易时间。记录的有效时间是该记录有效的时间段,而记录的事务时间是它在数据库中出现的时间。作为一个很好的实用介绍,我推荐关于如何在 SQL 中创建时态数据库的书:Developing Time-Oriented Database Applications in SQL作者:Richard T. Snodgrass。
    另外,您可能想了解的有关时态数据库的所有信息都可以在 Temporal Database Entries for the Springer Encyclopedia of Database Systems 中阅读。这是一个非常全面的文档(我将从“临时数据库”条目开始),但要更快地开始,请查看 Temporal Database Glossary更容易浏览和阅读,还有网站Time Center其出版物部分有(或确实有……)与该地区最著名的出版物的链接。
    因此,既然您已经了解了所有这些,您很快就会看到第 11 页上的图像可以表示为复合事件,并且可以被检测/评估,前提是您已经实现了复合事件检测器的正确所需子集,并且休息可以表示为具有时间方面的表中的条目:)
    Martin Fowler 本人在他的 Patterns for things that change with time 中谈到了这一点。总结了许多处理时间的模式。
    最后,我可能会为时间信息创建一个数据库模式,并为事件部分使用 DB 规则或在应用程序中实现该部分(尽管有龙)。如果您使用 PostgreSQL,规则机制在 The Rule System 中描述。文档的一部分。
    很多东西要读,但如果你彻底理解了这一切,你的职业净 Assets 就会增加很多:)
    此外,谷歌的好术语是“时间数据库”、“事件数据库”、“ECA 规则”。

    关于sql - Fowler 时间表达式的关系模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/310963/

    相关文章:

    mysql - 如果字段为空,为什么 SQL "NOT IN (' val 1')"不返回?

    python - 如何从 Python 中的 SQL 查询字符串中删除引号?

    sql - 如何从 Postgres 的预订中找到第一个免费开始时间

    java - 如何自动删除连接表中的行以避免 ConstraintViolationException?

    c# - 为什么我应该在我的 EF 顶部构建一个包含工作单元的存储库模式?

    java - 安排多次启动 Java 中的方法

    scheduling - 为什么工作没有平均分配给 gunicorn worker ?

    php - 当列数等于一或二时,如何找到两个表的唯一结果?

    java - 如何使从 JPA 中的父类(super class) transient 继承的映射字段?

    scheduling - 如何在特定时间每天触发 akka scheduler?