【问题标题】:selecting on two tables in Cassandra在 Cassandra 的两张桌子上进行选择
【发布时间】:2023-04-03 23:19:02
【问题描述】:

我在一个项目中使用Cassandra,这是我的第一个项目。 ,并且我正在尝试对两个表执行一个简单的请求,但这不起作用...

我想做这样的事情:

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

是否可以在Cassandra 的两个表上请求?我该怎么做?

谢谢

【问题讨论】:

  • 请详细解释您的问题!您想在一个请求中从表中进行选择吗?你需要像SELECT * from table1 and table2 这样的东西吗?或SELECT * from table1SELECT * from table2?你能写出你有目的的请求吗?
  • 好吧,我想你想加入表格!您应该阅读以下内容:stackoverflow.com/questions/17248232/…

标签: cassandra request cql


【解决方案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 尽可能多地复制。您会注意到“福特”在结果集中被指定了 3 次。如果您有 13 款福特汽车的数据,您将存储“福特”的值 13 次。
  • Cassandra 中的主键是唯一的。我已将 carid 添加为 PRIMARY KEY 的一部分,以确保每个 model 的唯一性,否则每个 make 的 INSERT 会覆盖自身。

【讨论】:

  • 所以对于我的项目,我可以有一个集合,这个集合可以有产品,这个产品有属性,但是在一个集合中,产品的所有属性都可见,而在另一个集合中product 将只有两个可见的属性。但是我要做什么表呢?现在我有一个表集合、collection_contains、collection_attributs、products 和 products_contains,但我这样做就像传统的 RDBMS...
猜你喜欢
  • 1970-01-01
  • 2017-02-07
  • 2016-05-18
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2017-09-06
相关资源
最近更新 更多