2010-12-12 22 views
11

对于我的其中一个项目,我必须将大量事件集合输入到数据库中供以后处理,并且我试图确定哪个DBMS最适合我的用途。针对时间序列事件的数据库建议

我:

  • 关于4亿在数据的时刻

  • 约600 GB将存储在数据库中

这些事件来在离散事件各种格式,但我估计个人属性的数量约为5000。大多数事件只包含每个约100个属性的值。属性值将被视为任意字符串,在某些情况下,则是整数。

事件最终将整合到一个时间序列中。虽然他们确实有一些内部结构,但没有提到其他事件,我相信这意味着我不需要对象数据库或某种ORM系统。

我的要求:

  • 开源许可 - 我可能要调整了一点。

  • 可扩展到多个服务器,但首先只使用一个系统。

  • 快速查询 - 更新没有那么重要。

  • C/C++,Java和Python的成熟驱动程序/绑定。最好使用与其他玩家合作的许可证 - 我宁愿不因技术决定而对任何事情做出承诺。我认为大多数数据库驱动程序在这里没有问题,但无论如何它应该被提及。

  • Linux的可用性。

  • 这将是很好,但不是必须的,如果它也可用于Windows

我理想中的DB因为这将让我从指定的时间段内的所有事件与单个查询。

我发现/迄今认为:

  • Postgresql与增加的页面大小可以明显地在每个表最多6000列。如果我的属性数量估计没有关闭,它可能会这样。

  • MySQL似乎每表有4,000列的限制。我可能用一点SQL-fu使用多个表,但我宁愿不。

  • MongoDB是我目前所倾向的。这将允许我保留事件的内部结构,同时仍然能够查询它们。其API也似乎非常直截了当。我不知道它在性能方面表现如何 - 至少在一台服务器上。

  • OpenTSDB及其度量收集框架听起来很有趣。我可以为每个属性使用单个时间序列(这可能有助于我的一些处理),将属性值作为标记并附加标记条目以将其关联到特定事件。从管理员和应用程序员的角度来看,这三者的准备曲线可能陡峭一些。不知道它的表现。直接使用HBase。尽管从我过去使用hadoop的经验来看,这可能会比我的要求更符合我的要求,但管理费用可能仍高于前三种选择。

有可能是其他数据库可以做到这一点,所以随时让我知道 - 我会很感激任何建议或评论,可能会帮助我与此。 PS:作为DB管理员,我只有很少的经验,所以我对任何误解表示歉意。

+0

大多数(所有?)SQL数据库管理系统对一行中的字节数也有限制。根据特定的dbms,它可能是一个硬限制(无法创建一个表可能会在一行中存储超过8k字节)或软限制(某些列可能会被移动到db内的一个备用存储位置,影响性能)。 – 2011-02-10 22:27:14

回答

4

使用具有数千列的表格是疯狂的。特别是当你说的大部分都是零时。

你应该首先考虑从这个转换你的数据结构:

table_1 
------- 
event_id 
attribute_1 
attribute_2 
[...] 
attribute_5000 

弄成这个样子:

table_1   event_values    attributes 
--------   ------------    ---------- 
event_id   event_id     attribute_id 
       attribute_id    attribute_type 
       attribute_value 

可与任何关系数据库管理系统(你唯一的约束来使用,那么将是总数据库的大小和性能)

+0

由于各种原因,我最终使用MongoDB,性能和易用性是最重要的。无论如何,你提出的模式是一个基本的ORM模式,应该可以用于任何关系数据库,这就是为什么我会接受这个答案。 – thkala 2011-10-29 12:12:53

0

这可能是很晚的答案,但这是我做的。

我使用HDF5作为我的时间序列存储库。它有许多有效和快速的压缩风格,可以混合和匹配。它可以与许多不同的编程语言一起使用。它可以在Windows和Linux上使用。

我使用boost :: date_time作为时间戳字段。这允许多种基于日期时间的计算。

在金融领域,我然后创建特定的数据结构,每个酒吧,蜱,交易,报价,...

我创造了许多定制迭代器和使用标准模板库算法,能够高效地搜索基于时间的记录的特定值或范围。然后可以将选择加载到内存中。