Apache Cassandra Data modeling



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

最新更新