我需要一些帮助的数据模型,以保存智能表数据,我非常新的工作与卡桑德拉。
必须存储的数据:
这是一个1智能表的例子:
{"logical_name":"smgw_123",
"ldevs":
[{"logical_name":"sm_1",“对象”:{"capture_time":390600,“单位”:30,“标量”:-3,“状态”:"000",“值”:152.361925},
{"logical_name":"sm_2",“对象”:{"capture_time":390601,“单位”:33,“标量”:-3,“状态”:"000",“值”:0.3208547253907171},
{"logical_name":"sm_3",“对象”:{"capture_time":390602,“单位”:36,“标量”:-3,“状态”:"000",“值”:162.636025}]
}
这是1智能仪表网关和logical_name "smgw_123“。
在ldevs数组中,是3智能仪表,并描述了它们的值。
因此,智能仪表网关与3台智能电表有关。智能仪表又有了自己的数据。
问题
我不知道如何将这些数据存储在无sql数据库中(在我的例子中是cassandra)中,这些数据有关联。
我必须使用两个以上的列吗?类似于智能仪表网关(逻辑名称、智能meter1、智能仪表2、智能仪表3)
另一个带有智能表(逻辑名称、捕获时间、单位、定标器、状态、值)
???
另一个问题是,所有智能电表网关都可以有不同数量的智能仪表。
我希望我能描述我的问题可以理解。
thx
发布于 2018-01-09 11:32:11
在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);
当您通过smart_meter_gateway查询smg_logical_name表时,您将在结果集中得到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数组使用集合列,这种方法有一些优点和缺点。正如我在一开始所说的,它取决于您的查询需求。
https://stackoverflow.com/questions/48128122
复制相似问题