假设我有以下事件数据方案:
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"
}
}
此外:
天真的RDBMS方法将涉及制作约500个表(每个具体类型的“数据”一个)。我对这种方法打了折扣(=在建模时过度浪费人力)。另外,我无法通过user_id轻松搜索所有记录(因为user_id出现在很多表中)。
在RDBMS中展平结构也非常昂贵(N-8个元素为NULL并且不包含任何信息)。
Mongodb类型的文档数据库解决方案似乎很好,但是,如果每个记录保存属性名称,空间成本似乎相当高,并不比RDBMS好多少。但是,这允许我按数据对象中的字段进行索引。
对我来说,理想的数据表示形式是一个表,它被优化以允许具有许多空元素的行(例如,通过每行保持一个活动列位掩码)。或者文档集合,其中文档集合维护使用的文档模式库,可以压缩数据(以及每个文档都引用其模式)。
人们会为上述案例推荐什么样的数据库?
答案 0 :(得分:1)
MS SQL Server 2008及更高版本Sparse Columns。表中最多可以添加30,000个,并且可以对它们建立索引(建议使用筛选索引)。或者BOL说,我自己没有用过它们。这将导致一个非常大的表可能支持您所需的。
话虽如此,我不知道它会特别有效。一些数学:
所以存储似乎没有太过分了......但我不知道,你想要处理一些严重的尺寸投影因素。这只是存储,您想要或需要做数据?指定行的检索时间是否重要?那么分析和数据挖掘呢?我是一个彻头彻尾的SQL人员,我认为它可以完成,但这几乎是Hadoop和NoSQL解决方案设计的问题,并且值得您花时间彻底调查这些选项。