【问题标题】:Design for simple database for an event stream为事件流设计简单的数据库
【发布时间】:2010-01-12 17:40:25
【问题描述】:

对于个人项目,我想记录一连串不相关的事件,以便稍后收集简单的统计数据。每个事件都可以有 [wildly] 不同的数据与之关联。

我正在寻找一些关于如何构建它的建议。由于这是一个小项目,我的主要目标是:

  • 易于设置
  • 易于使用(即没有奇怪的连接)

性能并不重要,我将是唯一的用户。

为了让您了解我的目标,这是我目前的计划:

表:Event_Definitions

列:

  • 身份证
  • 姓名
  • 类型
  • 选项

表格:活动

列:

  • 身份证
  • 定义_ID
  • Option_Values
  • 注意事项

假设我们有两个事件定义,如下所示:

ID:0;名称:Pigeon_Released;类型:时间;选项:空

ID:1;名称:Fed_Pigeon;类型:Fixed_List;选项:面包、饼干、豆腐

然后我们记录一些事件:

ID:0;定义_ID:1; Option_Values:面包;备注:空

ID:1;定义_ID:1; Option_Values:豆腐;笔记:“他咕哝”

ID:2;定义_ID:0;选项值:12:34:56;笔记:“我也咕咕咕”

选项值将通过程序强制执行。


在收集了一些事件之后,我将收集相同类型的事件进行比较。我不希望检索具有特定值的事件,而只是检索相同类型的事件。


所以问题是,关于此策略或替代方案的任何建议或 cmet?我很欣赏这种方法的简单明了,但令我困扰的是,即使偶数的“值”可以是字符串、时间、索引号等,它们都存储在同一列中。

【问题讨论】:

    标签: database database-design events architecture


    【解决方案1】:

    实际上,您有一个原则上可以保存任何内容的数据“blob”,然后是一个架构定义来说明应该如何解释该 blob

    it's a date
    

    it's one of these values
    

    这对于个人项目来说是相当合理的。 “blob”方法的一个缺点是在进行查询时可能会出现阻抗不匹配的情况。如果您需要处理 blob 内容,这会有点麻烦。

    另一条评论是,您的定义表可能会受到限制,您希望将一些更复杂的结构化数据放入您的 blob。

    我想知道使用 XML 作为您的 blob 是否有帮助。然后 XML 模式定义 blob 内容,也许您根本不需要事件定义表。您的数据库(和某些人一样)是否具有任何可以利用的 XML 功能?

    【讨论】:

    • 我喜欢使用 XML 模式来定义选项的想法,但我不认为任何选项都非常复杂。到目前为止,我计划的所有值要么是单值,要么是相同类型的多个值,或者键/值对。
    • 我认为你是对的。但是,如果您的数据库“获取”XML,您可能会发现它仍然很有用。
    • 我通过 Python 使用 SQLite,它似乎没有这个功能。我选择这个答案是因为这些建议似乎最符合项目的范围。
    【解决方案2】:

    RDBMS 不是用作事件流的最佳技术解决方案,而且您对可变属性的要求不符合关系范式。

    尝试改用Message Queue


    好的,如果您需要存储和比较事件,那就不同了。当我听到“事件”时,我认为它只是为了实时通知。所以我对消息队列的建议在这种情况下可能不合适。

    不过,关系数据库并不容易支持表中的变量属性。您可以尝试使用Concrete Table InheritanceClass Table Inheritance 等设计模式来解决您的问题。

    【讨论】:

    • 消息队列对我来说存储有意义,但它对检索更有效吗?我将收集所有相同类型的事件进行比较。
    • 我曾考虑将每种类型的事件放入它自己的表中(似乎是表继承提供的简化),但我预计会有相当多的事件定义,并可能在期间创建新定义正常使用。无论如何,我从未听说过表继承,我将把它归档以备后用。 :)
    【解决方案3】:

    大多数事件流应用程序使用 XML 来定义事件对象。尽管许多确实有类似 SQL 的语言,但它们不使用底层 RDBMS。您可能想查看 Marco of ruleCore,他们完成了设计自己的 CEP 应用程序的整个练习并在博客中介绍了它。

    即使像 StreamBaseCoral8 这样的流引擎在设计时也需要事件流的架构,因此即使它们也可能不符合您对 @987654324 的要求@

    所以,最后你可能需要使用类似的东西:

    <event>
        <head>
            <id>12784536</id>
            <type_id>51</type_id>
            <time_stamp>2008-12-11T13:25:57.014Z</time_stamp>
            <source_id>862</source_id>
        </head>
        <body>
            <!-- Event specific data here -->
        </body>
    </event>
    

    【讨论】:

    • 我已更新问题以澄清(希望如此):数据库的目标不是发送事件,而是记录它们以供以后收集统计数据。事件流可能不是正确使用的术语。无论如何,那些“流引擎”看起来对于这个项目来说太过分了。
    【解决方案4】:

    我尝试了一个带有 rulecore 的小项目来开发一个有点像你的系统。我使用 mysql 数据库存储事件流,然后将它们批量发送到我创建了大约 20 条规则的规则核心。 rulecore 事件格式非常简单,命名属性几乎可以包含任何内容。我也这样做了,因为我第一次尝试使用 sql 查询导致了复杂的模式和非常长且难以理解的查询。 rulecore 规则要简单得多。

    【讨论】:

    • 似乎有一些东西叫做“规则核心”。能给个链接吗?
    • 您可以在 rulecore.com 上找到它
    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多