我们正在尝试在基于物联网的应用程序中使用Apache Cassandra。我们计划创建一个设备抽象。任何用户都应该能够定义具有一系列属性的设备。对于每个属性,用户应能够定义一系列属性,如名称,数据类型,最小值,最大值等。
下面给出了一些设备示例
车辆
车辆可以具有以下属性
温度传感器
温度传感器可以具有以下属性
实时,每个设备将作为键值对发送数据。
例如: - 车辆可以发送以下数据
时间: - 2016年6月4日11:15:15.150,纬度:-1.256,经度: - -180.75,速度: - 50
时间: - 2016年6月4日11:15:16.150,纬度:-1.257,经度: - -181.75,速度: - 51
例如: - 温度传感器可以发送以下数据
时间: - 2016年6月4日11:15:15.150,当前温度:100,单位:farenheit
时间: - 2016年6月4日11:15:16.150,纬度:101,单位:farenheit
由于不同设备的属性可能不同,我们对cassandra中的表格模型感到困惑......我想到的一些选项是为设备创建表格,或者创建单个表格表和存储地图数据类型中的值...我们对应该采取哪种方法感到困惑... 任何建议表示赞赏
答案 0 :(得分:1)
绝对不要为每台设备创建一个表。我想你会得到100s / 1000s的表格,而对模型的建模控制最小。 Cassandra对此不太满意,因为它需要每个表的内存,这将减少密钥缓存和行缓存(如果使用它)的可用内存。
地图方法可能是可行的,但在沿着这条路走下之前还有一些事情需要考虑:
设备条目是否会经常更新,您将如何更新? 如果您计划更新地图中的每个元素,则必须单独更新每个元素。原因是在Cassandra中覆盖集合将为每次覆盖创建一个范围逻辑删除。如果经常覆盖,那么你最终会得到数百万个墓碑,最终可能不会像你想的那样有效地压缩。这可以通过使用JSON类型,并在您的应用程序中处理它来避免。
您还需要考虑如何查询数据,如果您希望用户能够查询地图中的数据,则可能会更复杂一些。我认为无论设备类型如何,您都可以使用单一的查询方法,然后在应用程序中提取详细信息。然而,这取决于您,并且几乎是您构建数据的驱动力。我可以给出的最好的建议是尽量避免创建太多的表,并且还要警惕让用户对数据结构进行大量控制,因为它很容易做得不好并导致集群出现性能问题。 / p>
如果您还没有,请阅读本博客 - 它指出了使用Cassandra时需要正确的数据模型设计的基本元素。 http://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling
答案 1 :(得分:1)
我认为最好的选择是只创建一个带有通用模式的表来收集时间系列数据。
示例CQL:
CREATE TABLE timeline (
device uuid,
time timeuuid,
key text,
value blob,
…
PRIMARY KEY ((device, key), time)
);
值可以存储为 blob (自定义序列化),映射或数字标量,具体取决于您的应用程序用例&数据访问模式(如何读取/写入/删除以及您是否计划支持更新)。
FYI关于时间序列建模的有用的相关Datastax帖子:
答案 2 :(得分:-1)
您是否考虑过使用Cassandra中的不同Collection Data类型来存储设备之间不同的信息?
https://docs.datastax.com/en/cql/3.0/cql/cql_using/use_collections_c.html