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