📜  Cassandra 中具有实用方法的物化视图

📅  最后修改于: 2021-09-09 11:10:03             🧑  作者: Mango

在本文中,我们将讨论 Cassandra 中的一种实用方法。在 Cassandra 中,物化视图处理服务器端的反规范化,并在基表和物化视图之间确保最终的一致性。让我们通过一个例子来理解。

让我们首先定义基表,使 student_marks 是获得班级最高分的基表。在这个基表中,subject_name、student_name 和marks 是列。我们将创建基表的物化视图表并查询下面给出的以下查询。

从物化视图中查找学生在班级中的最高分。

示例:基表 – student_marks

CREATE TABLE student_marks
(
  subject_name text, 
 student_name text,
  marks int,
  PRIMARY KEY (subject_name, marks)
); 

输出:

现在,让我们讨论上述基表的物化视图,我们将在其中创建显示班级学生最高分的视图。

为了创建物化视图(物化视图表——everytime_high_marks),我们提供了一个简单的选择语句和用于该视图的主键。指定 CLUSTERING ORDER BY 允许我们对最高分进行反向排序,这样我们就可以通过简单地选择分区中的第一项来获得最高分。

要创建物化视图,请使用以下 CQL 查询。

CREATE MATERIALIZED VIEW everytime_high_marks AS
SELECT student_name, marks, subject_name 
FROM student_marks 
WHERE student_name IS NOT NULL 
      AND marks IS NOT NULL 
      AND subject_name IS NOT NULL
PRIMARY KEY (subject_name, marks) 
WITH CLUSTERING ORDER BY (marks desc);  

输出:

现在,首先我们将数据插入到基表中,它也将反映物化视图。插入数据后,我们可以从物化视图表中进行查询,并获得 CQL 查询所需的结果。实际上,我们使用 DataStax Studio 运行所有查询来验证 CQL 查询。

使用以下 CQL 查询将数据插入到基表中。

INSERT INTO student_marks (student_name, subject_name, marks) 
       VALUES ('Ashish', 'Cassandra DB', 95);
INSERT INTO student_marks (student_name, subject_name, marks) 
       VALUES ('Rana', ' Cassandra DB ', 80);
INSERT INTO student_marks (student_name, subject_name, marks) 
       VALUES ('Amit', ' Cassandra DB ', 85);
INSERT INTO student_marks (student_name, subject_name, marks) 
       VALUES ('Shivang', ' Cassandra DB ',90);
INSERT INTO student_marks (student_name, subject_name, marks) 
       VALUES ('Kartikey', ' Cassandra DB ',92);
INSERT INTO student_marks (student_name, subject_name, marks) 
       VALUES ('Dhruv', 'Cassandra DB',93);
INSERT INTO student_marks (student_name, subject_name, marks) 
       VALUES ('Rahul', 'Cassandra DB',91);
INSERT INTO student_marks (student_name, subject_name, marks) 
       VALUES ('Gaurav', 'Cassandra DB',96); 

输出:

图 – 将数据插入基表

SELECT * 
FROM everytime_high_marks 
WHERE subject_name = 'Cassandra DB'; 

输出:

图 – MV 输出

现在,我们可以搜索在给定科目的班级中得分最高的学生。我们可以使用物化视图表来得到我们期望的结果。我们来看一下。

SELECT student_name, marks 
FROM everytime_high_marks 
WHERE subject = 'Cassandra DB' limit 1; 

在这里,我们可以使用带有 WHERE 子句的“主题”列,因为它也是物化视图的主键。

输出:

如输出表所示, Gaurav96分,是全班最高的。