在 cassandra 中使用可能的空值对嵌套数据进行建模

Posted

技术标签:

【中文标题】在 cassandra 中使用可能的空值对嵌套数据进行建模【英文标题】:Modeling nested data with possible null values in cassandra 【发布时间】:2014-08-07 15:26:20 【问题描述】:

我的情况类似于问题Nested data data modelling in Cassandra?中描述的情况

我有一个项目实体,我的应用需要能够为其显示项目特定信息,包括参与该项目的机构和供应商。项目实体可描述如下:

"id": 7162fe80-1e44-11e4-8c21-0800200c9a66, "name": "Test Project", "synopsis": "Lorem Text goes here" "agencies" : [ "id": c3e28810-1e44-11e4-8c21-0800200c9a66 "name": "Test Agency" ], "vendors": [ "id": 1c0ba760-1e45-11e4-8c21-0800200c9a66 "name": "Test Vendor" ]

但是,有时项目可能没有任何供应商或代理机构(或者可能有其中一个实体,但没有另一个):

"id": 7162fe80-1e44-11e4-8c21-0800200c9a66, "name": "Test Project", "synopsis": "Lorem Text goes here" "agencies" : [], "vendors": []

什么是对这些数据建模的好方法?

我尝试了以下架构,但似乎都有问题:

架构 1: CREATE TABLE projects ( id uuid, name text, synopsis text, vendor_id uuid, vendor_name text, agency_id uuid, agency_name text PRIMARY KEY (id, vendor_id, agency_id)

但是通过这种方法,我不能拥有没有供应商或代理机构的项目(vendor_id 或 Agency_id 不能为空)。

架构 2: CREATE TABLE projects ( id uuid, name text, synopsis text, vendor_id uuid, vendor_name text, agency_id uuid, agency_name text PRIMARY KEY (id)

但是通过这种方法,每个项目我只能有一个供应商和一个代理机构。

我对使用地图/列表/集合来建模这些数据犹豫不决,因为这似乎是 CQL 2/3 中的一个新功能。我也担心“数据一致性”。例如,供应商名称经常更改,我希望项目能够反映供应商的“最新名称”。

【问题讨论】:

【参考方案1】:

如果供应商名称经常更改,那么按照您的描述对架构进行非规范化可能不是最好的主意:您必须在每次名称更改后更新所有供应商/代理记录。

您可以为项目、供应商和机构创建典型的规范化表,并在应用程序级别进行连接:

CREATE TABLE projects (
    id uuid,
    name text,
    vendor_id list<uuid>,
    agency_id list<uuid>,
    PRIMARY KEY (id));

CREATE TABLE vendors (
    id uuid,
    name text,
    PRIMARY KEY (id));

CREATE TABLE agencies (
    id uuid,
    name text,
    PRIMARY KEY (id));

PS。尚未发布的 C* 2.1 将支持用户定义类型,因此您可以这样做:

CREATE TYPE vendor (
    id uuid,
    name text);

CREATE TYPE agency (
    id uuid,
    name text);

CREATE TABLE projects (
    id uuid,
    name text,
    vendors list<vendor>,
    agencies list<agency>,
    PRIMARY KEY (id));

【讨论】:

以上是关于在 cassandra 中使用可能的空值对嵌套数据进行建模的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL查询中的空值问题

如何避免嵌套的空检查[重复]

处理数据网格中的空值

数据库中的空值与NULL的区别以及python中的NaN和None

如何在 Spark 中过滤来自 Cassandra 的空数据?

可空引用类型意外 CS8629 可空值类型可能为带有临时变量的空