选择卡桑德拉的两张桌子

时间:2015-11-29 09:47:48

标签: cassandra request cql

我将Cassandra用于项目,这是我的第一个项目。 ,我试图在两个表上做一个简单的请求,但这不起作用......

我想做类似的事情:

Select * from table1, table2 where table1.test = test and table2.test2 = 123;

是否可以在Cassandra中的两个表格上进行请求?我怎么能这样做?

由于

1 个答案:

答案 0 :(得分:1)

  

我正在尝试在两个表上做一个简单的请求

您尝试做的事情被称为“分布式连接”,而Cassandra专门用于阻止您这样做。

解决这些类型问题的方法是使用名为非规范化的过程。假设你有两个简单的表carMakecarModel

 makeid | make
--------+--------
      1 |  Chevy
      2 |  Dodge
      3 |   Ford

 modelid | makeid | model
---------+--------+---------
      15 |      3 |   Focus
      11 |      3 | Mustang
      32 |      2 | Charger
      82 |      3 |  Fusion

现在,在传统的RDBMS中如果我想选择带有“福特”品牌的所有车型,我会执行JOIN查询。但是对于Cassandra,我们的想法是在建模阶段通过构建一个支持同时查询汽车制造和模型的能力的表来解决这个问题:

CREATE TABLE carMakeModel (
    carid int,
    make text,
    model text,
    PRIMARY KEY (make,carid));

aploetz@cqlsh:stackoverflow> SELECT * FROM carMakeModel WHERE make='Ford';

 make | carid | model
------+-------+---------
 Ford |     1 | Mustang
 Ford |     2 |   Focus
 Ford |     3 |  Fusion

(3 rows)

这里要注意的一些要点:

  • make尽可能重复。您会注意到“Ford”在结果集中指定了3次。如果您有13种型号福特的数据,您可以将“福特”的值存储13次。
  • Cassandra的主要钥匙是独一无二的。我已将carid添加为PRIMARY KEY的一部分,以确保每个model的唯一性,否则每个make的INSERT都会覆盖自身。