我需要一些数据模型的帮助来保存智能电表数据,我与Cassandra合作很新。
必须存储的数据:
这是 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)。
我必须使用2列以上吗?像智能电表网关(逻辑名称,智能电表1,智能电表2,智能电表3)
另一个带有智能电表(逻辑名称、捕获时间、单位、缩放器、状态、值)
???
另一个问题是,所有智能电表网关都可以拥有不同数量的智能电表。
我希望我能描述我的问题可以理解。
感谢
在 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 数组,这种方法有一些优点和缺点。正如我在开头所说,这取决于您的查询需求。