鉴于您的表描述,我会说 device_id 是设备的标识符(或 PK),
但这显然不是您的想法...
恕我直言,这是您问题的根源。
我不想显得学究气,但我经常看到人们忘记(或不知道)在关系模型中,关系不是(或不仅)表之间的关系,而是属性之间的关系, IE。在“域值”中获取的值,包括 PK 和 PK(参见您可以在网上轻松找到的 Codd 的关系模型定义)。
在关系模型中,表是关系,查询(SQL 中的 SELECT,包括连接)也是关系。
即使使用 NoSQL,实体也应该(恕我直言)至少遵循前 3 种范式(简称原子性和对 pk 的依赖),它们或多或少是最小的常识建模。
关于 PK,在关系模型中,关于自然主键与代位(非自然计算)主键存在激烈争论。
我倾向于使用自然的,通常是复合的键,但这只是一种观点,当然这取决于上下文。
在您的数据模型单元中(恕我直言)不应该是 PK 的一部分:它不能识别设备,它是设备的一个特征。
PK 必须唯一标识设备,它不是设备的位置或地点、单位或任何其他特征。它是唯一的 id、序列号、其他特征的组合,对于设备来说是唯一的,并且不会随时间或任何其他维度发生变化。
例如,对于带有嵌入式设备的汽车,您可以选择为每个嵌入式设备提供一个不透明的 uuid PK,并提供一个参考表以检索有关该设备的其他信息,以及一个复合 PK,可以通过以下方式给出:汽车制造商、汽车序列号 (sno)、设备类型、设备 ID。
比如:
CREATE TABLE raw_data (
car_maker text,
car_sno text,
device_type text,
device_id text,
time timestamp,
id uuid,
unit text,
value double,
PRIMARY KEY ((car_maker, car_sno, device_type, device_id), time)
)
示例数据:
( 'bmw', '1256387A1AA43', 'tyrep', 'tyre1', 'bar', 150056709xxx, 2.4 ),
( 'bmw', '1256387A1AA43', 'tyrec', 'tyre1', 'tempC',150056709xxx, 150 ),
( 'bmw', '1256387A1AA43', 'tyrep', 'tyre2', 'bar', 150056709xxx,2.45 ),
( 'bmw', '1256387A1AA43', 'tyrec', 'tyre2', 'tempC', 150056709xxx, 160),
( 'bmw', '1256387A1AA43', 'tyrep', 'tyre3', 'bar', 150056709xxx,2.5 ),
( 'bmw', '1256387A1AA43', 'tyrec', 'tyre3', 'tempC', 150056709xxx, 150 ),
( 'bmw', '1256387A1AA43', 'tyre', 'tyre4', 'bar', 150056709xxx,2.42 ),
( 'bmw', '1256387A1AA43', 'tyre', 'tyre4', 'tempC', 150056709xxx, 150 ),
这是一个普遍的想法,必须与您的问题保持一致。有时,uuid 和计算的键是最好的。
使用 Cassandra,困难在于您必须围绕查询设计模型,因为 PK 的第一部分是分区键,您无法查询(或者很难,您必须分页或使用其他系统,如 spark ) 多个分区之间。
不要想太多关系,不要害怕重复。
我建议你也看看 Cassandra 的 Chebotko 图,它可以帮助你围绕查询设计你的 Cassandra 架构 here 或 here 。
最好的,
阿兰