代码之家  ›  专栏  ›  技术社区  ›  Ipsquiggle

事件流的简单数据库设计

  •  2
  • Ipsquiggle  · 技术社区  · 15 年前

    对于个人项目,我想记录一系列不相关的事件,以便以后收集简单的统计数据。每个事件都可能有[非常]不同的相关数据。

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

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

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

    表: 事件定义

    柱:

    • 身份证件
    • 名称

    表: 事件

    柱:

    • 身份证件
    • 定义\u ID
    • 选项u值
    • 笔记

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

    ID:0;名称:鸽舍放生;;类型:时间;选项:空

    ID:1;名称:美联储鸽;类型:固定列表;选择:面包、饼干、豆腐

    ID:0;定义:1;选项_值:面包;注:空

    ID:1;定义:1;选项_值:豆腐;注:“他咕咕”


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


    4 回复  |  直到 15 年前
        1
  •  2
  •   Jeff Sternal    15 年前

    实际上,您已经得到了一个原则上可以容纳任何内容的“blob”数据,然后是一个模式定义来说明应该如何解释blob

    it's a date
    

    it's one of these values
    

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

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

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

        2
  •  1
  •   Bill Karwin    15 年前

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

    尝试使用 Message Queue


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

    不过,关系数据库并不容易支持表中的变量属性。您可以尝试使用如下设计模式 Concrete Table Inheritance Class Table Inheritance

        3
  •  1
  •   Damir Sudarevic    15 年前

    大多数事件流应用程序使用XML定义事件对象。尽管许多人有类似SQL的语言,但他们不使用底层RDBMS。你可能想退房 Marco of ruleCore

    甚至流引擎 StreamBase Coral8 在设计时需要事件流的模式,因此即使它们也可能不适合您的需求 "wildly different data".

    因此,最后,您可能需要使用以下内容:

    <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
  •  1
  •   Stjoan    15 年前

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