CQL cassandra加入并从2个不同的表格中选择多个数据

问题描述:

假设我有两个表部门和人员,以及来自人员表格的work_in与来自部门的id列(如外键和主键)相同。现在,如果我想要person表中的first_name,last_name和department表中的full_department_name。使用Equi连接可以获得这样的结果的CQL是什么?CQL cassandra加入并从2个不同的表格中选择多个数据

有关系建模的气味:)。卡桑德拉没有加入。提示:保持非规范化以适应查询。

在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将得到他的所有细节的查询请求,包括部门标识。

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 = ? 

或者你可以创建一个物化视图,而不是第二个表,然后卡桑德拉将保持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 = ? 
+0

感谢您的回复。因此,为了获得这种类型的数据,我总是需要创建另一个表并将数据(我需要从给定的表中)插入到它中? –

+0

作为替代方案,我向您提供了物化视图选项,以及您无需为其他表格进行管理/编码的情况。您需要根据查询模式开始建模。因此,根据需要解决的查询来设计表格。 – dilsingi

+0

是的,但MV只会给我人名表中的名字,姓氏,dept_id,而我希望整个部门名称位于另一个名为department的表中。例如。 dept_id是'ET',因此这个id的完整部门名称是'Education and Training'。我想要全名。 –