Cassandra:制作数据模型/架构

时间:2011-11-01 14:53:49

标签: nosql cassandra

(不确定它叫...模型..架构......超级模型?)

我在'm'(唯一ID)家中有'n'(唯一id'd)传感器。这些中的每一个都是0到'k'次/天(以1-5为块)。此数据当前存储在MySQL中,每个“主页”都有一个表格,结构为:

time stamp
sensor id
firing count

我无法围绕这个数据的'nosql'模型进行思考,这样我就可以找到家庭,时间或传感器的点火次数。

..或许这可能不是推送到nosql的正确数据?我们当前的服务器在负载下陷入困境(数亿行x数百个家庭)。我非常有兴趣找到一个允许cassandra可扩展性的数据存储。

2 个答案:

答案 0 :(得分:2)

这取决于。想想“先查询”的方法:

  1. 识别查询
  2. 建模数据
  3. 因此,虽然您可能有一个列系列作为您的物理模型,但您还将拥有一个或多个提供查询数据的列。而且,您可以进一步利用Cassandra功能,例如:

    列名称可以包含数据。您不必存储值,每个名称可以是时间戳,例如

    非常适合为每个密钥存储数千列,列将保持排序状态,并且可以按正向或反向顺序访问;因此,继续上面的示例,可以轻松获取传感器的所有时间戳列表

    复合数据类型允许您将多个数据位组合成键,名称或值。例如结合房屋ID和传感器ID

    计数器列提供简单的值增量,即使对于初始值也是如此,因此只需要一个写操作。

    可以在静态列名称上定义索引,这实际上提供了一个反向列族,其中包含键作为结果,只需要小心桶大小(例如,可能不希望值为millisec)< / p>

答案 1 :(得分:1)

通过传感器和房屋存储射击次数:

House_Sensors     <-Column family 
  house_id        <-Key
    sensor_id     <-Column name
    firing_count  <-Column value

以JSON-ish表示法表示的数据

House_Sensors = {
 house_1 : {
  sensor_1: 3436,
  sensor_2: 46,
  sensor_3: 99,
  ...
 },
 house_2 : {
  sensor_7: 0,
  sensor_8: 444,
  ...
 },
 ...
}

您可能希望定义另一个列族,其中sensor_id作为存储触发时间戳的键。

在设计架构时考虑您需要哪些查询,并根据需要进行非规范化。重复数据,Cassandra插入非常快。

触发的时间戳未存储在House_Sensor列族中。使用sensor_id作为密钥为其创建新的列族。

通过这种方式,您可以使用House_Sensor系列来查询点火计数以及每个房屋属于哪个传感器。使用其他列族查询触发时间戳。