我刚转到Cassandra,我有这样的项目来建模:
1.House - Here is its view 它有2. city,3。zip和4。property type
我还需要all cities view,我需要搜索表单完成的所有属性类型和拉链(尚未实现)。
据我所知,我应该创建4个表并制作主键..."外键",不应该吗?
我也有一点要求 - 比如哈里杜鲁门“给我一个单手的经济学家”,要求一位沮丧的美国总统。 “我所有的经济学家都说,'一方面......另一方面''”: - )。
我没有足够的经验与Cassandra做出选择,如果我得到"或者你可以这样做,或那样",所以只要给我一个最好的架构,我将实现它。
谢谢
答案 0 :(得分:0)
据我所知,我应该创建4个表并制作主键..."外键",不应该吗?
你绝对不想那样做。首先,Cassandra中不存在外键。其次,你所谈论的是从关系角度进行建模。使用Cassandra,您不希望跨多个表分布一个查询的数据,因为这可能分布在多个节点上。查询多个节点会在方程中引入更多的网络时间,这很慢。
在Cassandra中,您希望采用基于查询的建模方法。有时,这可能意味着每个查询一个表。考虑到这一点,我听说您需要以两种不同的方式查询您的属性:
基本上,您应该有一个表来为每个查询提供服务:
CREATE TABLE housesbymls (
mls text,
city text,
price bigint,
propertytype text,
state text,
street text,
year bigint,
zip text,
PRIMARY KEY (mls));
CREATE TABLE housesByCity (
mls text,
street text,
city text,
state text,
zip text,
propertyType text,
price bigint,
year bigint,
PRIMARY KEY ((state,city),zip,mls));
在插入一些数据后,我可以通过MLS查询:
aploetz@cqlsh:stackoverflow> SELECT * FROM housesByMLS WHERE mls='09110857';
mls | city | price | propertytype | state | street | year | zip
----------+----------+--------+------------------+-------+--------------------------------+------+-------
09110857 | Palatine | 104900 | Condominium Unit | IL | 1025 North Serling Avenue, 211 | 1978 | 60067
(1 rows)
我可以按州/市或州/市/邮编查询:
aploetz@cqlsh:stackoverflow> SELECT * FROM housesByCity
WHERE state='IL' AND city='Palatine';
或:
aploetz@cqlsh:stackoverflow> SELECT * FROM housesByCity
WHERE state='IL' AND city='Palatine' AND zip='60067';
这两个都回归:
state | city | zip | mls | price | propertytype | street | year
-------+----------+-------+----------+--------+------------------+--------------------------------+------
IL | Palatine | 60067 | 09110857 | 104900 | Condominium Unit | 1025 North Serling Avenue, 211 | 1978
(1 rows)
这个PRIMARY KEY结构背后的想法是state
和city
组成分区键(这有助于Cassandra找出将该行放在集群中的位置)所以它们是都需要。然后,由于城市可以有多个zip
代码,您还可以将查询重点放在该代码上。 Cassandra中的主要键是唯一的,因此我将mls
放在最后以确保唯一性。