【问题标题】:Table design Cassandra表设计卡桑德拉
【发布时间】:2017-11-22 21:18:04
【问题描述】:

我正在保存来自一台机器的数据,可以说它有不同的传感器。

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)的位置。更改传感器表中的位置会使旧数据失效。

我有一种感觉,我仍然在以关系的方式思考。您建议如何解决这个问题?

【问题讨论】:

    标签: database cassandra nosql


    【解决方案1】:

    鉴于您的表描述,我会说 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 架构 herehere

    最好的,

    阿兰

    【讨论】:

    • 谢谢。也许我表达得不够清楚。在我的示例中,“raw_data”是传入传感器数据的表。我添加了“unit”作为主键的一部分,因为目前数据是通过“deviceId”和“unit”查询的。我看到,对于“deviceId”的查询,我只会将数据复制到另一个具有“deviceId”作为唯一 PK 的表中
    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 2015-10-19
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多