CQL cassandra连接并从2个不同的表中选择多个数据

时间:2017-07-01 15:09:53

标签: cassandra datastax cql nosql

假设我有两个表部门和人员,人员表中的列work_in与部门的id列相同(如外键和主键)。现在,如果我想要来自person表的first_name,last_name和来自department表的full_department_name,该怎么办?使用Equi join获得此类结果的CQL是什么?

1 个答案:

答案 0 :(得分:1)

那里的关系造型气味:)。 Cassandra没有加入。提示:保持非规范化以适应查询。

在Cassandra中,数据模型应该适合访问模式,并且可以在执行此操作时复制数据。因此,我们不需要将两个表设计相互连接,而是需要两个表设计来提供不同的查询模式。

比如说

访问模式1:,如果person_id在部门详细信息中找到他/她的详细信息。创建下表以提供该用例

CREATE TABLE department_by_person (person_id int, first_name text, last_name text, dept_id int , PRIMARY KEY (person_id, dept_id));

现在,使用person_id的查询将获取所有请求的详细信息,包括department_id。

select * from department_by_person where person_id  = ?

访问模式2:,如果dept_id在人员详细信息中找到他/她的详细信息。您可以通过分区键dept_id

为另一个表提供此用例
CREATE TABLE person_by_department (person_id int, first_name text, last_name text, dept_id int , PRIMARY KEY (dept_id, person_id));

现在,使用dept_id的查询将获取所有他/她的详细信息,包括person_id。但请记住,还需要使用其他编码来保持这两个表同步,这些表只是基于访问模式而重复。

select * from person_by_department where dept_id  = ?

或者你可以创建一个物化视图而不是第二个表,然后Cassandra将保持MV与表同步。换句话说,此处不需要额外的应用程序工作来保持同步。

create materialized view mv_person_by_department as 
select person_id, first_name, last_name, dept_id 
from department_by_person
where person_id is not null 
and dept_id is not null
primary key (dept_id, person_id);

现在,使用dept_id的查询将获取所有他/她的详细信息,包括person_id。

select * from mv_person_by_department where dept_id  = ?