📜  Cassandra 中的物化视图

📅  最后修改于: 2021-09-08 16:20:26             🧑  作者: Mango

在本文中,我们将讨论物化视图的概述及其重要性。在 Cassandra 中,物化视图发挥着重要作用,因此物化视图适用于高基数数据。我们还讨论了如何创建、更改和删除物化视图。让我们一一讨论。

物化视图:
物化视图就像基表一样工作,它被定义为可以像基表一样查询的 CQL 查询。物化视图对于 Cassandra 查询语言中数据的反规范化非常重要,也有利于高基数和高性能。让我们通过一个例子来理解。

现在,首先我们要定义基表(基表 – User_information),User1 是键空间名称。 User_name 是分区键,我们将通过它以排序方式获得结果。物化视图将使用相同的主键,并且由于在物化视图中定义主键的限制,可以在物化视图中为主键添加另一列以获取用户信息。 User_name、User_email、User_password 和 User_address 是基表的列。我们来看一下。

要为用户信息创建表,请使用以下 CQL 查询。

CREATE TABLE User1.User_information (          
User_name text PRIAMRY KEY,
User_email text,
User_password text,
User_address text
);

现在,让我们考虑一下,如果我们想在用户电子邮件的帮助下找到用户信息,那么我们需要创建一个新表,通过将电子邮件定义为分区键,我们可以获得用户信息,但我们还有另一个更好的选择,称为物化视图

所以,现在让我们创建上面给定的表的实体化,也称为基表。要创建物化视图,请使用以下 CQL 查询。

语法:创建物化视图:

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [keyspace_name.] view_name
AS SELECT column_list
FROM [keyspace_name.] base_table_name
WHERE column_name IS NOT NULL 
      [AND column_name IS NOT NULL ...]  
      [AND relation...] 
PRIMARY KEY ( column_list )
[WITH [table_properties]  
[AND CLUSTERING ORDER BY (cluster_column_name order_option )]]

语法来源

例子:

CREATE MATERIALIZED VIEW User1.Users_by_User_email AS
SELECT User_email, User_password, User_address
FROM User_information
WHERE User_name IS NOT NULL AND User_email IS NOT NULL
PRIMARY KEY (User_email, User_name ); 

要执行从物化视图读取数据的操作,请使用以下 CQL 查询。

SELECT * 
FROM Users_by_User_email 
WHERE User_email = ? ;

在物化视图中必须遵循以下限制。

  1. 在物化视图中,无论基表中的主列必须包含在物化视图表中,以确保 MV(物化视图)的每一行都对应于基表。
  2. 仅在物化视图中,我们可以再添加一个不是基表中主列的列。

让我们举个例子来理解这个概念。

CREATE TABLE base_table
(
Key1 int,
Col1 int,
Col2 int,
Col3 int,
Col4 text,
PRIAMRY KEY (key1, Col1, Col2)
); 

允许上述给定基表的物化视图。我们来看一下。

Case-1:
CREATE MATERIALIZED VIEW test_MV1 AS 
SELECT * 
FROM test_MV1 
WHERE key1 IS NOT NULL 
      AND Col1 IS NOT NULL 
      AND Col2 IS NOT NULL 
PRIMARY KEY (Col1, key1, Col2);

Case-2:
CREATE MATERIALIZED VIEW test_MV2 AS 
SELECT * 
FROM test_MV2 
WHERE key1 IS NOT NULL 
      AND Col1 IS NOT NULL 
      AND Col2 IS NOT NULL 
      AND Col3 IS NOT NULL 
PRIMARY KEY (Col3, key1, Col1, Col2); 

不允许上述给定基表的物化视图。我们来看一下。

Case-1:
CREATE MATERIALIZED VIEW test_MV1 AS 
SELECT * 
FROM test_MV2 
WHERE key1 IS NOT NULL 
      AND Col1 IS NOT NULL 
      AND Col2 IS NOT NULL 
      AND Col3 IS NOT NULL 
PRIMARY KEY (Col3, Col4, key1, Col1, Col2);  
 // * ERROR : it will give an error that Col3 
         and Col4 is not primary key in base table.

Case-2:
CREATE MATERIALIZED VIEW test_MV1 AS 
SELECT * 
FROM test_MV2 
WHERE Col1 IS NOT NULL 
      AND Col2 IS NOT NULL 
PRIMARY KEY (Col1, Col2);
// * ERROR : it will give an error that key1 is primary key 
    in base table that must contain in materialized view. 

改变物化视图:
下面给出的是使用 ALTER 命令更改物化视图的基本属性的 CQL 查询。我们来看一下。

句法:

ALTER MATERIALIZED VIEW [keyspace_name.] view_name 
[WITH table_options] 

删除物化视图:
我们可以使用DROP命令删除物化视图表,不会对基表产生影响。

句法:

DROP MATERIALIZED VIEW [IF EXISTS] [keyspace_name.] view_name 

例如,要删除物化视图,请使用以下 CQL 查询。

DROP MATERIALIZED VIEW User1.Users_by_User_email ;