[英]Table design Cassandra
我正在从一台具有不同传感器的机器上保存数据。
CREATE TABLE raw_data (
device_id uuid,
time timestamp,
id uuid,
unit text,
value double,
PRIMARY KEY ((device_id, unit), time)
)
我需要知道发送数据时正在使用哪个传感器。 我可以添加一个字段“ sensor_id”,并将与传感器相关的数据存储在另一个表中。 这种方法的问题是我必须存储可以改变的传感器(A,B,C)的位置。 更改传感器表中的位置将使旧数据无效。
我觉得我仍然在以关系方式思考很多。 您如何建议解决此问题?
给定您的表描述,我想说device_id是设备的标识符(或PK),但这显然不是您在想的...而且恕我直言,这是问题的根源。
我不想显得学究,但我经常看到人们忘记(或不知道)在关系模型中,关系不是(或不仅是)表之间的关系,而是属性之间的关系,即。 在“域值”中获取的值,包括PK和PK(请参见在网络上可以轻松找到的Codd的关系模型定义)。 在关系模型中,表是一个关系,查询(SQL中的SELECT,包括联接)也是一个关系。 即使使用NoSQL,实体(IMHO)也应至少遵循前3种正常形式(原子性和对pk的依赖性),这至少是最小常识建模。
关于PK,在关系模型中,关于自然主键与代位副键(非自然计算出的)主键存在激烈的争论。 我倾向于使用自然键(通常是复合键),但这只是一种意见,当然取决于上下文。
在您中,数据模型单元(IMHO)不应作为PK的一部分:它不能识别设备,它是设备的特征。 PK必须唯一地标识设备,它不是设备的位置或位置,单元或任何其他特征。 它是唯一的ID,序列号,其他特征的组合,并且对于设备而言是唯一的,并且不会随时间或其他任何维度而变化。
例如,对于带有嵌入式设备的汽车,您可以选择为每个嵌入式设备提供不透明的uuid PK,并带有参考表以检索有关该设备的其他信息,并可以通过以下方式提供复合PK:car maker,汽车序列号(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模式。
最好,
阿兰
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.