Apache Cassandra数据建模

时间:2018-01-06 14:03:42

标签: cassandra nosql datamodel

我需要一些数据模型的帮助来保存智能电表数据,我很高兴使用cassandra。

必须存储的数据:

这是1智能电表的一个例子:

{" logical_name":" smgw_123",

"的LDEV":

[{" logical_name":" sm_1"," objects":[{" capture_time":390600," unit& #34;:30," scaler":-3," status":" 000"," value":152.361925}]},

{&#34; logical_name&#34;:&#34; sm_2&#34;,&#34; objects&#34;:[{&#34; capture_time&#34;:390601,&#34; unit&# 34;:33,&#34;缩放器&#34;:-3,&#34;状态&#34;:&#34; 000&#34;,&#34;值&#34;:0.3208547253907171}]},< / p>

{&#34; logical_name&#34;:&#34; sm_3&#34;,&#34; objects&#34;:[{&#34; capture_time&#34;:390602,&#34; unit&# 34;:36,&#34;缩放器&#34;:-3,&#34;状态&#34;:&#34; 000&#34;,&#34;值&#34;:162.636025}]}] < / p>

}

所以这是 1智能电表网关,其中包含logical_name&#34; smgw_123&#34;。

ldevs数组 3 smartmeters 并描述了它们的值。

因此,智能电表网关与3个智能电表有关。智能电表再次拥有自己的数据。

问题

我不知道如何在无sql数据库(在我的情况下是cassandra)中存储这些有关系的数据。

我必须使用2列吗?像smartmetergateway(逻辑名称,智能电表1,智能电表2,智能电表3)

和另一个智能电表(逻辑名称,捕获时间,单位,缩放器,状态,值)

???

另一个问题是,所有智能电表网关都可以有不同数量的智能电表。

我希望我能说出我的问题是可以理解的。

THX

1 个答案:

答案 0 :(得分:0)

在Cassandra数据建模中,您应该做的第一件事就是确定您的查询。您将根据查询对表的分区键和群集列进行建模。

在您的示例中,我假设您将根据其逻辑名称查询智能电表网关。我的意思是,您的查询看起来像

select <some_columns> 
from smart_meter_gateway 
where smg_logical_name = <a_smg_logical_name>;

此外,我假设每个智能电表网关逻辑名称都是唯一的,并且ldevs数组中的每个智能电表名称都具有唯一的逻辑名称。

如果是这种情况,则应创建一个表,其中包含smg_logical_name的分区键列和sm_logical_name的集群列。通过这样做,您将创建一个表,其中每个智能仪表网关分区将包含若干行智能仪表:

 create table smart_meter_gateway 
 (
     smg_logical_name text,
     sm_logical_name text,
     capture_time int,
     unit int,
     scaler int,
     status text,
     value decimal,
     primary key ((smg_logical_name), sm_logical_name)
);

您可以使用以下语句插入此表:

insert into smart_meter_gateway (smg_logical_name, sm_logical_name, capture_time, unit, scaler, status, value)
values ('smgw_123', 'sm_1', 390600, 30, -3, '000', 152.361925);

insert into smart_meter_gateway (smg_logical_name, sm_logical_name, capture_time, unit, scaler, status, value)
values ('smgw_123', 'sm_2', 390601, 33, -3, '000', 0.3208547253907171);

insert into smart_meter_gateway (smg_logical_name, sm_logical_name, capture_time, unit, scaler, status, value)
values ('smgw_123', 'sm_3', 390602, 36, -3, '000', 162.636025);

当您通过smg_logical_name查询smart_meter_gateway表时,您将在结果集中获得3行:

select * from smart_meter_gateway where smg_logical_name = 'smgw_123';

此查询的结果是:

smg_logical_name    sm_logical_name     capture_time    scaler  status  unit    value
smgw_123            sm_1                390600          -3      000     30      152.361925
smgw_123            sm_2                390601          -3      000     33      0.3208547253907171
smgw_123            sm_3                390602          -3      000     36      162.636025

您还可以将sm_name添加为查询过滤器:

select * 
from smart_meter_gateway 
where smg_logical_name = 'smgw_123' and sm_logical_name = 'sm_1';

这次结果集中只有1行:

smg_logical_name    sm_logical_name     capture_time    scaler  status  unit    value
smgw_123            sm_1                390600          -3      000     30      152.361925

请注意,您还可以通过其他方式为数据建模。例如,您可以将集合列用于ldevs数组,这种方法有一些优点和缺点。正如我在开始时所说,这取决于您的查询需求。