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 = ?
感谢您的回复。因此,为了获得这种类型的数据,我总是需要创建另一个表并将数据(我需要从给定的表中)插入到它中? –
作为替代方案,我向您提供了物化视图选项,以及您无需为其他表格进行管理/编码的情况。您需要根据查询模式开始建模。因此,根据需要解决的查询来设计表格。 – dilsingi
是的,但MV只会给我人名表中的名字,姓氏,dept_id,而我希望整个部门名称位于另一个名为department的表中。例如。 dept_id是'ET',因此这个id的完整部门名称是'Education and Training'。我想要全名。 –