我需要一些数据模型的帮助来保存智能电表数据,我很高兴使用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
答案 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数组,这种方法有一些优点和缺点。正如我在开始时所说,这取决于您的查询需求。