在本文中,我们将讨论 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';
输出:
现在,我们可以搜索在给定科目的班级中得分最高的学生。我们可以使用物化视图表来得到我们期望的结果。我们来看一下。
SELECT student_name, marks
FROM everytime_high_marks
WHERE subject = 'Cassandra DB' limit 1;
在这里,我们可以使用带有 WHERE 子句的“主题”列,因为它也是物化视图的主键。
输出:
如输出表所示, Gaurav有96分,是全班最高的。