假设我有以下事件数据方案:
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 好多少。但是,这确实允许我按数据对象中的字段进行索引。
对我来说,一个理想的数据表示应该是一个经过优化以允许具有许多空元素的行的表(例如,通过保持每行的活动列位掩码)。或者一个文档数据库,其中一个文档集合维护一个文档模式库,用于压缩数据(并且每个文档都引用其模式)。
对于上述示例,人们会推荐哪种数据库?