【问题标题】:Relational Schema for Fowler's Temporal ExpressionsFowler 时间表达式的关系模式
【发布时间】:2010-09-23 13:58:39
【问题描述】:

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

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

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

一些可能的选择:

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

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

【问题讨论】:

    标签: sql orm scheduling recurrence


    【解决方案1】:

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

    所以我想说,在 SQL 范式中你能做的最多就是存储 365 行,对应于一年中的日期,以及相应日期是否满足的真/假值定期计划的标准。所以你必须使用实现 Fowler 模型的 OO 逻辑来进行计算,并存储得到的 365 行。

    那么,您何时需要知道“今天(或任何给定日期)是否是日程安排的一部分?”查找适当的行并检查真/假列非常容易。对于任何数据库来说,每年存储 365 行都是微不足道的。

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

    【讨论】:

    • 感谢您的想法...我看到的一个直接问题是无法重建用于生成日期集的规则。保存“每周一”将为您提供 52(或 53)个数据点,但加载这些数据点并不一定意味着“每周一”。
    • 模型时间更好。有一年中的几天、星期几、月份等的表格,所有这些都由 time_id 链接。然后,您可以在这些表上使用选择来表达任何(基于天的)规则。
    • @Dmitriy:即使你这样做,你也会遇到要加入哪些表以及在 WHERE 子句中使用什么布尔表达式来组合这些术语的问题。这不是 SQL 旨在解决的问题。
    【解决方案2】:

    恐怕这个答案会是很多参考和很少的实用代码,自从我上次搞砸这个已经有一段时间了,但是......

    我认为您想在这里混合使用的两种技术是'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 中创建时态数据库的书: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 中亲自解决了大部分问题,总结了许多处理时间的模式。

    最后,我可能会为时间信息创建一个数据库模式,然后将数据库规则用于活动部分或在应用程序中实现该部分(尽管有龙)。如果您使用 PostgreSQL,规则机制在文档的The Rule System 部分中进行了描述。

    阅读内容很多,但如果您彻底了解所有这些内容,您的职业净资产可能会上升不少 :)

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

    【讨论】:

    • 我打算给你一个正确的答案,但我没时间了,所以当我不得不停下来时,你得到了一个关于我所拥有的东西的大脑转储。希望你不要介意。我认为这将是我存储链接以供将来参考的好地方:)
    • 一点也不——只是“时间数据库”这个词让我想到了一些新的东西,包括这本书:cs.arizona.edu/people/rts/tdbbook.pdf——即使它不是我所需要的,仍然会很有趣:)
    • 当然,我怎么会忘记那个:) 我会把它放在答案中,这样下一个人就不必阅读 cmets 来找到它。 Snodgrass 是该地区的权威。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多