我通过说明来警告这个问题:我对 NoSQL 有点陌生,对 Cassandra 也很陌生,但它似乎很适合我正在尝试做的事情。
假设我有一个以合理间隔提供输入的传感器列表。我提出的数据模型是按传感器的名称、它所在的位置(区域)和日期(写为 yyyyMMdd)进行分区,然后按读数发生的实际时间对当天的读数进行聚类。想法是“在日期 B 从传感器 A 获取所有读数”的查询应该非常快。到目前为止,我认为很好。表 / CF 在 CQL 中如下所示:
CREATE TABLE data (
area_id int,
sensor varchar,
date ascii,
event_time timeuuid,
PRIMARY KEY ((area_id, sensor, date), event_time)
) WITH CLUSTERING ORDER BY (event_time DESC);
然而,这实际上并不包含任何数据,我不确定如何将其添加到模型中。每个读数(来自同一个传感器)都可以有一组不同的任意数据,我不会提前知道这是什么。例如,我可以获得温度数据,我可以获得湿度,我可以同时获得两者,或者我可以获得我以前从未见过的东西。这取决于实际记录数据的人要提交的内容(不是从自动传感器读取)。
鉴于我想对这些数据(基本上是 UGC)进行查询操作,我有什么选择?查询通常包括对数据的计数(例如,计数传感器 A 在日期 B 的读数,其中 some_ugc_valueX = C 和 some_ugc_valueY = D)。值得注意的是,将有比通常一次查询更多的数据点。一个读数可能有 20 个数据值,但可能只有 2 个或 3 个会被查询 - 只是提前不知道哪个。
目前我想到了:
- 将读取的每个传感器的数据存储为 Map 类型。这肯定会使模型变得简单,但我的理解是查询会很困难?我想我需要为每个传感器读数拉回整个地图,然后检查值并在 Storm/Hadoop/whatever 中的 Cassandra 之外对其进行计数。
- 将每个用户值存储为另一列(带有 event_time uuid 的复合列)。这意味着不使用 CQL,因为它不支持在插入时添加任意新列。然而,Thrift API 确实允许这样做。这意味着我可以让 Cassandra 自己进行计数。
也许我会以错误的方式解决这个问题?也许 Cassandra 甚至不是此类数据的最佳选择?