在 Cassandra 中对具有多个地址的用户 table 进行数据建模

Data modelling a user table with multiple addresses in Cassandra

我刚刚开始使用 Cassandra。我正在测试以下数据模型。我想知道如何在 Cassandra 中对其进行建模?

Users
{ 
    "userId" : "73180" , 
    "firstName" : "John" , 
    "lastName" : "Doe"
    "addresses" : 
    { 
        "type" : "homeAddress"
        "street" : "a pretty street" , 
        "city" : "Some city" , 
        "state" : "CT",
        "country" : "US"
        "zipcode" : 55555
    } , 
    { 
        "type" : "businessAddress"
        "street" : "an office street" , 
        "city" : "Some city" , 
        "state" : "CT",
        "country" : "US"
        "zipcode" : 55555
    } , 
}

具体来说,如何为每个用户建模多个地址?

您可能希望为地址创建 user defined type,然后将其用于 home_address 和 business_address 字段。

虽然将地址建模为用户定义类型 (UDT) 是一种很好的方法,但您还应该考虑查询模式的外观。您将仅通过 userid 查询用户吗?或者您想按名称查询它们?

为了演示这一点,我将创建一个地址 UDT 并设计一个 usersByLastName 查询 table:

CREATE TYPE address (
  street TEXT,
  city TEXT,
  state TEXT,
  postal TEXT,
  country TEXT);

CREATE TABLE usersByLastName (
  userid BIGINT,
  firstName TEXT,
  lastName TEXT,
  addresses MAP <TEXT, FROZEN <address>>,
  PRIMARY KEY (lastName,firstName,userid));

请注意,addresses 是作为 address 的 MAP 创建的,因此您在类型(家庭、办公室、运输、账单...等)和地址数量方面具有一定的灵活性您可以为每个用户添加。

接下来,我将插入一些数据并通过 lastName 进行查询,结果为:

aploetz@cqlsh:Whosebug> SELECT * FROM usersbylastname WHERE lastname='Doe';

 lastname | firstname | userid | addresses
----------+-----------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      Doe |      Jane |  73184 | {'business': {street: 'A Office St.', city: 'Somecity', state: 'CT', postal: '55555', country: 'US'}, 'home': {street: 'B Pretty St.', city: 'Somecity', state: 'CT', postal: '55555', country: 'US'}, 'shipping': {street: '1187 Huntervasser', city: 'Los Angeles', state: 'CA', postal: '90036', country: 'US'}}
      Doe |      John |  73180 | {'business': {street: 'A Office St.', city: 'Somecity', state: 'CT', postal: '55555', country: 'US'}, 'home': {street: 'A Pretty St.', city: 'Somecity', state: 'CT', postal: '55555', country: 'US'}}

(2 rows)

这是您可以建模的一种方式。同样,考虑您的查询要求很重要。

编辑:我现在正在参加 Cassandra 峰会的主题演讲,Jonathan Ellis 刚刚用地址地图向用户 table 进行了演示,这与我所做的差不多。