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

时间:2014-08-07 15:26:21

标签: cassandra data-modeling cassandra-2.0

我的情况类似于问题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 个答案:

答案 0 :(得分:0)

如果供应商名称经常更改,则可能不是您所描述的去规范化架构的最佳选择:您必须在每次更改名称后更新所有供应商/代理商记录。

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

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));