追踪非同质事件的最佳数据库实践

时间:2013-09-06 22:18:50

标签: database data-structures nosql database-schema

假设我有以下事件数据方案:

event_record_unique_id: long
event_timestamp: long
session_id: long
event_id: int
event_data: data  # concrete type depends on event_id

...所以,数据的内容可能依赖于,例如500,event_ids,导致“数据”的200种不同的具体数据类型。例如:

{
   event_record_unique_id: 17126721
   event_timestamp: 1234
   session_id: 3452
   event_id: 50
   event_data: {
       user_id: 123
       page_id: 789
   }
}
{
   event_record_unique_id: 1712672123
   event_record_unique_id: 17126723
   event_timestamp: 1234
   session_id: 3454
   event_id: 51
   event_data: {
       user_id: 124
       button_id: 789
   }
}
{
   event_timestamp: 1234
   session_id: 3454
   event_id: 51
   event_data: {
       crash_report: "text"
       device_id: "12312"
   }
}

此外:

  • 许多event_data属性出现在许多具体的event_data对象中
  • 我需要对某些event_data属性执行索引搜索(例如找到user_id = X的所有记录)
  • 一直需要继续添加事件类型和新属性
  • 上面的数据结构总是平滑的,因此单个记录可以等效地表示为具有N列的行(和属性名称/类型碰撞)  通过重命名属性来解决。)

天真的RDBMS方法将涉及制作约500个表(每个具体类型的“数据”一个)。我对这种方法打了折扣(=在建模时过度浪费人力)。另外,我无法通过user_id轻松搜索所有记录(因为user_id出现在很多表中)。

在RDBMS中展平结构也非常昂贵(N-8个元素为NULL并且不包含任何信息)。

Mongodb类型的文档数据库解决方案似乎很好,但是,如果每个记录保存属性名称,空间成本似乎相当高,并不比RDBMS好多少。但是,这允许我按数据对象中的字段进行索引。

对我来说,理想的数据表示形式是一个表,它被优化以允许具有许多空元素的行(例如,通过每行保持一个活动列位掩码)。或者文档集合,其中文档集合维护使用的文档模式库,可以压缩数据(以及每个文档都引用其模式)。

人们会为上述案例推荐什么样的数据库?

1 个答案:

答案 0 :(得分:1)

MS SQL Server 2008及更高版本Sparse Columns。表中最多可以添加30,000个,并且可以对它们建立索引(建议使用筛选索引)。或者BOL说,我自己没有用过它们。这将导致一个非常大的表可能支持您所需的。

话虽如此,我不知道它会特别有效。一些数学:

  • 假设每秒10行
  • 每天变为10 * 60 * 60 * 24 = 864,000行
  • 或每年315,360,000行
  • 非常粗略估计每行50个字节
  • 每年约14GB
  • 您需要保留数据多少年?
  • 并加倍,如果它更像是每秒20行

所以存储似乎没有太过分了......但我不知道,你想要处理一些严重的尺寸投影因素。这只是存储,您想要或需要数据?指定行的检索时间是否重要?那么分析和数据挖掘呢?我是一个彻头彻尾的SQL人员,我认为它可以完成,但这几乎是Hadoop和NoSQL解决方案设计的问题,并且值得您花时间彻底调查这些选项。