在Cassandra中为具有多个地址的用户表建模的数据

时间:2015-09-21 22:32:49

标签: cassandra data-modeling cassandra-2.0

我刚开始在卡桑德拉。我正在测试以下数据模型。我想知道如何在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
    } , 
}

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

为了证明这一点,我将创建一个地址UDT并设计一个usersByLastName查询表:

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的地理位置,因此您可以在类型(家庭,办公室,运费,结算等)和地址数量方面具有一定的灵活性按用户添加。

接下来,我将按lastName插入一些数据和查询,这会产生:

aploetz@cqlsh:stackoverflow> 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只是演示了一个带有地址图的用户表,几乎就是我的做法。