在 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 进行了演示,这与我所做的差不多。
我刚刚开始使用 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 进行了演示,这与我所做的差不多。