我刚开始在卡桑德拉。我正在测试以下数据模型。我想知道如何在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
} ,
}
具体来说,我如何为每个用户建模多个地址?
答案 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只是演示了一个带有地址图的用户表,几乎就是我的做法。