2010-01-12 52 views
2

对于个人项目,我想记录一系列不相关的事件,以稍后收集简单的统计数据。每个事件都可以[广泛]具有与之相关的不同数据。针对事件流的简单数据库设计

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

  • 设置的难易
  • 易于使用(即不怪联接)

性能不是关键,我会是只有用户。

为了给你什么,我瞄准的想法,这是我目前的计划:

表:Event_Definitions

列:

  • ID
  • 名称
  • 类型
  • 选项

表:活动

色谱柱:

  • ID
  • Definition_ID
  • Option_Values

所以说,我们有两个事件定义,像这样:

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

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

然后我们记录一些事件:

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

ID:1;定义_ID:1; Option_Values:豆腐;注:“他咕咕噜”

ID:2; Definition_ID:0; Option_Values:12:34:56;注意:“我也吼过”

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


一些事件已被收集后,我会被一起收集同一类型的事件进行比较。我不希望检索具有特定值的事件,只是相同类型的事件。


所以问题是,再次,这个策略或替代方案的任何意见或评论?我很欣赏这种方法的简单明了,但它让我感到困扰,即使“偶数”的“值”可能是字符串,时间,索引号等等,它们也都存储在同一列中。

回答

2

有效你有一个数据的“斑点”,可以在原则上不放任何东西,然后一个模式定义说团块应如何解释

it's a date 

it's one of these values 

这对于个人项目来说非常合理。 “blob”方法的缺点是在执行查询时可能存在某种阻碍不匹配的情况。如果你需要处理blob内容,它会有点麻烦。

另一个意见是,你的定义表可能会变得有限制,你想在你的blob中放一些更复杂的结构化数据。

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

+0

我喜欢使用XML模式来定义选项的想法,但我没有预见到任何复杂的选项。到目前为止我计划的所有项目都是单值或同一类型的多个值或键/值对。 – Ipsquiggle 2010-01-12 19:37:34

+0

我认为你是对的。但是如果你的数据库“获得”XML,你可能会发现它很有用。 – djna 2010-01-12 19:41:13

+0

我通过Python使用SQLite,似乎没有此功能。我正在选择这个答案,因为这些建议似乎与项目的范围最接近。 – Ipsquiggle 2010-01-12 20:58:29

1

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

尝试使用Message Queue代替。


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

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

+0

消息队列对我来说是有意义的存储,但它对于检索更有效吗?我将收集所有同类型的活动进行比较。 – Ipsquiggle 2010-01-12 18:44:31

+0

我曾考虑将每种类型的事件放入它自己的表格中(似乎是Table Inheritance提供的简化),但我期望有相当多的事件定义,并且可能会在正常使用期间创建新的定义。无论如何,我从来没有听说过表继承,我将提交一个供以后使用。 :) – Ipsquiggle 2010-01-12 20:56:28

1

大多数事件蒸汽应用程序使用XML来定义事件对象。尽管很多人拥有类似SQL的语言,但他们不使用底层的RDBMS。您可能想要查看Marco of ruleCore谁经历了设计自己的CEP应用程序的整个练习并对其进行了博客。

StreamBaseCoral8即使流引擎需要在设计时的事件流的模式,因此,即使他们可能不适合你的"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> 
+0

我已经更新了这个问题来澄清(希望):数据库的目标不是发送事件,而是记录它们以便稍后进行统计信息收集。事件流可能不是正确的用语。 在任何情况下,这些'流引擎'看起来对于这个项目来说都是过分的。 – Ipsquiggle 2010-01-12 19:27:58

1

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

+0

似乎有一些东西叫'rulecore'。你能提供一个链接吗? – Ipsquiggle 2010-01-13 16:52:21

+0

你可以在rulecore.com找到它 – Stjoan 2010-01-15 10:04:11