0

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

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 好多少。但是,这确实允许我按数据对象中的字段进行索引。

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

对于上述示例,人们会推荐哪种数据库?

4

1 回答 1

1

MS SQL Server 2008 及更高版本具有Sparse Columns。一个表最多可以添加30000个,并且可以建立索引(推荐过滤索引)。或者说 BOL,我自己没有使用过它们。这将导致一个非常大的表可能支持您需要的内容。

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

  • 假设每秒 10 行
  • 变为 10*60*60*24 = 每天 864,000 行
  • 或每年 315,360,000 行
  • 粗略地高估了每行 50 个字节
  • 大约 14GB 一年
  • 您必须保留数据多少年?
  • 如果它更像每秒 20 行,则翻倍

所以存储似乎并不过分……但我不知道,你想处理一些严重的尺寸预测因素。这只是存储,您想要或需要对数据什么?指定行的检索时间重要吗?分析和数据挖掘呢?我是一个彻头彻尾的 SQL 专家,我认为这是可以做到的,但这几乎就是 Hadoop 和 NoSQL 解决方案设计的那种问题,而且完全值得你花时间彻底研究这些选项。

于 2013-09-09T14:17:59.747 回答