Cassandra:如何制定数据模型/架构

3

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

我有“n”个(唯一标识的)传感器在“m”个(唯一标识的)家庭中。每个传感器每天可以触发0到“k”次(以1-5块为单位)。这些数据当前存储在MySQL中,每个“家庭”都有一个表格,并具有以下结构:

time stamp
sensor id
firing count

我对使用“nosql”模型来查找按家庭、时间或传感器计算发射次数的数据有困难。

也许这不是推送到nosql的正确数据类型?我们当前的服务器在重负载下出现问题(数亿行x数百个家庭)。我非常希望找到一个可以扩展性类似于cassandra的数据存储。


为什么你要每个家庭都有一个单独的表,而不是一个表和一个外键?此外,您每秒接收多少传感器测量值,它们有多大,并且您需要进行什么样的分析? - user359996
2个回答

2
这要看情况。采用“先查询”方法:
1.确定查询 2.建立数据模型
因此,虽然你可能有一个列族作为你的物理模型,但你也会有一个或多个列族,以提供按查询方式检索到的数据。而且,你还可以进一步利用Cassandra的特性,例如:
1. 列名可以包含数据。你不需要存储值,每个名称都可以是时间戳,例如。 2. 它非常适合为每个键存储数千个列,这些列将保持排序,并且可以按正序或倒序访问;所以,继续上面的例子,可以轻松获取传感器的所有时间戳列表。 3. 复合数据类型允许你将多个数据位组合成键、名称或值。例如,结合房屋ID和传感器ID。 4. 计数器列提供简单的值增量,即使是初始值,所以只需进行写操作。 5. 索引可以定义在静态列名上,这实际上提供了一个反向的列族,其键为结果,只需小心桶大小(例如,可能不想要毫秒级的值)。

1

存储传感器和房屋的触发计数:

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

以类JSON的表示法表示的数据

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列族查询触发计数和每个房屋所属的传感器。使用其他列族查询触发时间戳。


那么在“house_1”中,我可以有20K次对“sensor_1”的触发,每次都带有某种时间戳吗?(这个时间戳将由传感器提供,并且与Cassandra时间戳无关) - ethrbunny
另外,如果我有第二个列族,这是否意味着所有数据都会存储两次? - ethrbunny
如果您使用第二个列族,这意味着所有数据都会被存储两次。从您的问题中不清楚您需要如何读取数据,但如果第二个列族只是使用时间戳作为列名称,每个触发器一个(值可以为空),它将允许您获取给定时间范围和传感器的精确触发次数。当然,这比读取单个计数器要更昂贵。 - Tyler Hobbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接