Cassandra数据库模型

时间:2016-02-08 18:29:23

标签: cassandra nosql

我刚转到Cassandra,我有这样的项目来建模:

1.House - Here is its view 它有2. city,3。zip和4。property type

我还需要all cities view,我需要搜索表单完成的所有属性类型和拉链(尚未实现)。

据我所知,我应该创建4个表并制作主键..."外键",不应该吗?

我也有一点要求 - 比如哈里杜鲁门“给我一个单手的经济学家”,要求一位沮丧的美国总统。 “我所有的经济学家都说,'一方面......另一方面''”: - )。

我没有足够的经验与Cassandra做出选择,如果我得到"或者你可以这样做,或那样",所以只要给我一个最好的架构,我将实现它。

谢谢

1 个答案:

答案 0 :(得分:0)

  

据我所知,我应该创建4个表并制作主键..."外键",不应该吗?

你绝对不想那样做。首先,Cassandra中不存在外键。其次,你所谈论的是从关系角度进行建模。使用Cassandra,您不希望跨多个表分布一个查询的数据,因为这可能分布在多个节点上。查询多个节点会在方程中引入更多的网络时间,这很慢。

在Cassandra中,您希望采用基于查询的建模方法。有时,这可能意味着每个查询一个表。考虑到这一点,我听说您需要以两种不同的方式查询您的属性:

  • by" house" (MLS?)
  • 按城市

基本上,您应该有一个表来为每个查询提供服务:

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结构背后的想法是statecity组成分区键(这有助于Cassandra找出将该行放在集群中的位置)所以它们是都需要。然后,由于城市可以有多个zip代码,您还可以将查询重点放在该代码上。 Cassandra中的主要键是唯一的,因此我将mls放在最后以确保唯一性。