我们需要存储来自可穿戴设备(想想Fitbit)的数据,以供很多用户进行缓存。数据的分辨率为一分钟,我们目前关注的是六个变量。经过一番研究,我们决定使用Cassandra 数据库应该是可扩展的,并且变量的数量可能会增加。将只有一种类型的查询:在datetime和datetime之间获取ownerId的所有变量 我们想到了这个问题的多种解决方案:
第一种方法是使主键由ownerId和日期(或可能是一个月或一年)组成,并将变量与时间(可能是日和月)结合起来作为其他列键。
| Primary key | variable1:hh:MM | variable2:hh:MM | ... |
|--------------------|-----------------|-----------------|-----|
| ownerId + yy-mm-dd | value | value | ... |
| ownerId + yy-mm-dd | value | value | ... |
| ... | ... | ... | |
这将产生大约合理数量的列,并且可以轻松添加变量并且可以很好地扩展。但是,这也意味着一个列族都存在。
第二个选项是为每个ownerId:
创建一个列族| Primary key | variable1:hh:MM | variable2:hh:MM | ... |
|-------------|-----------------|-----------------|-----|
| yy-mm-dd | value | value | ... |
| yy-mm-dd | value | value | ... |
| ... | ... | ... | |
然而,这意味着将有数千或数百万个列族。
第三个选项是为每个变量创建一个列族:
| Primary key | hh:MM | hh:MM | ... |
|--------------------|-------|-------|-----|
| ownerId + yy-mm-dd | value | value | ... |
| ownerId + yy-mm-dd | value | value | ... |
| ... | ... | ... | |
这样可以非常轻松地添加新变量,但由于我们的查询总是需要所有变量,因此需要查找数据六次或更多次。
我们错过了任何选择吗?您认为哪个最符合我们的目标?