繁体   English   中英

餐桌设计卡桑德拉

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM