Cassandra 数据定义

CQL将数据存储在表中,并且这些表按 KeySpace分组。 KeySpace定义了许多适用于它包含的所有表的选项,其中最重要的是 KeySpace使用的复制策略。 通常情况下,一个应用程序使用一个KeySpace。本章介绍用于创建,修改和删除这些KeySpace和表的语句。

1.KEYSPACE

使用CREATE KEYSPACE语句创建KeySpace:

create_keyspace_statement :: = CREATE KEYSPACE [IF NOT EXISTS] keyspace_name WITH option

示例如下:

Create KEYSPACE Excelsior
            WITH replication = {'class':'SimpleStrategy','replication_factor':3};
Create KEYSPACE Excalibur
            WITH replication = {'class':'NetworkTopologyStrategy','DC1':1,'DC2':3}
             AND durable_writes = false;

支持的选项是:

1542356101701906.png

Replication是必需的,并且必须至少包含'class'子选项,该子选项定义要使用的复制策略类。 其余的子选项取决于使用的复制策略。 默认情况下,Cassandra支持以下“Class”:

'SimpleStrategy' 和 'NetworkTopologyStrategy'。

Use

USE语句允许更改当前KeySpace。 CQL中的许多对象绑定到KeySpace(表,用户定义的类型,函数),当前KeySpace是在没有完全限定名称的情况下引用这些对象时使用的默认KeySpace(即没有 以KeySpace名称为前缀)。 

use_statement :: = USE keyspace_name
ALTER KEYSPACE
ALTER KEYSPACE语句允许修改KeySpace的选项:
alter_keyspace_statement :: = ALTER KEYSPACE keyspace_name WITH options

例如:

ALTER KEYSPACE Excelsior
           WITH replication = {'class':'SimpleStrategy','replication_factor':4};

DROP KEYSPACE

可以使用DROP KEYSPACE语句删除KeySpace:

drop_keyspace_statement :: = DROP KEYSPACE [IF EXISTS] keyspace_name

例如:

DROP KEYSPACE Excelsior;

删除KeySpace会立即并且不可逆转地删除该KeySpace,包括其中的所有表,UTD和函数,以及这些表中包含的所有数据。

2.Create Table

创建新表使用CREATE TABLE语句:

create_table_statement ::=  CREATE TABLE [ IF NOT EXISTS ] table_name
                            '('
                                column_definition
                                ( ',' column_definition )*
                                [ ',' PRIMARY KEY '(' primary_key ')' ]
                            ')' [ WITH table_options ]
column_definition      ::=  column_name cql_type [ STATIC ] [ PRIMARY KEY]
primary_key            ::=  partition_key [ ',' clustering_columns ]
partition_key          ::=  column_name
                            | '(' column_name ( ',' column_name )* ')'
clustering_columns     ::=  column_name ( ',' column_name )*
table_options          ::=  COMPACT STORAGE [ AND table_options ]
                            | CLUSTERING ORDER BY '(' clustering_order ')' [ AND table_options ]
                            | options
clustering_order       ::=  column_name (ASC | DESC) ( ',' column_name (ASC | DESC) )*

例如:

CREATE TABLE monkeySpecies (
    species text PRIMARY KEY,
    common_name text,
    population varint,
    average_size int
) WITH comment='Important biological records'
   AND read_repair_chance = 1.0;
CREATE TABLE timeline (
    userid uuid,
    posted_month int,
    posted_time uuid,
    body text,
    posted_by text,
    PRIMARY KEY (userid, posted_month, posted_time)
) WITH compaction = { 'class' : 'LeveledCompactionStrategy' };

列定义

CQL表中的每一行都有一组在创建表时定义的预定义列(可以稍后使用alter语句添加)。

column_definition主要由定义的列的名称和类型组成, 此外,列定义可以具有以下修饰符:

STATIC

它将列声明为静态列, 静态列将属于同一分区(具有相同分区键)并且在所有行中共享

3. Primary Key

声明该列是表的主键

示例如下:

CREATE TABLE t (
    pk int,
    t int,
    v text,
    s text static,
    PRIMARY KEY (pk, t)
);
INSERT INTO t (pk, t, v, s) VALUES (0, 0, 'val0', 'static0');
INSERT INTO t (pk, t, v, s) VALUES (0, 1, 'val1', 'static1');
SELECT * FROM t;
   pk | t | v      | s
  ----+---+--------+-----------
   0  | 0 | 'val0' | 'static1'
   0  | 1 | 'val1' | 'static1'

在表中,行由其PRIMARY KEY唯一标识,因此所有表必须定义PRIMARY KEY(并且只有一个)。 PRIMARY KEY可以在表中定义一个或多个列组成。主键定义了关键字PRIMARY KEY,后面跟着括号中用于组成它的列名和逗号分隔列表,如果主键只有一列,则可以通过PRIMARY KEY关键字跟随该列定义。如果主键包含多列,则主键定义中列的顺序很重要。

CQL主键由2部分组成,分别是Partitioning Key 和 Clustering Key。

分区键:主键定义的第一个组件,它可以是单个列,也可以是多个列组成的复合列。表至少有一个分区键。如下表定义:

CREATE TABLE t(k text PRIMARY KEY);

聚类列 (Clustering Key): 主键定义的第一个组件之后的列,这些列的顺序定义了聚类顺序。

主键定义的一些示例如下:

PRIMARY KEY(a):a是分区键,没有聚类列
PRIMARY KEY(a,b,c):a是分区键,b和c是聚类列
PRIMARY KEY((a,b),c):a和b组成分区键(通常称为复合分区键),c是聚类列

4. 分区键

在表中,CQL定义了分区(Partitioning)的概念。分区是一组行并且这些行的分区键具有相同的值。注意,如果分区键是由多个列组成的复合主键,只有所有的分区键列具有相同的值,则这些行才可以属于同一个分区 。例如,下表定义:

CREATE TABLE t (
    a int,
    b int,
    c int,
    d int,
    PRIMARY KEY ((a, b), c, d)
);
SELECT * FROM t;
   a | b | c | d
  ---+---+---+---
   0 | 0 | 0 | 0    // row 1
   0 | 0 | 1 | 1    // row 2
   0 | 1 | 2 | 2    // row 3
   0 | 1 | 3 | 3    // row 4
   1 | 1 | 4 | 4    // row 5

第1行和第2行在同一个分区中,第3行和第4行也在同一个分区,第5行在另一个分区中。

注意,表始终具有分区键,并且如果表没有Clustering 列,则该表的每个分区仅由单行组成(因为主键唯一标识行,主键等于分区列)。

分区最重要的属性是属于同一分区的所有行都保证存储在同一组副本节点上。表的分区键定义哪些行将在集群中一起本地化,因此选择分区键很重要,这样需要一起获取的行就在同一个分区中 。另外需注意的是,由于所有相同的分区键的行都保证存储在同一副本节点集上,因此具有太多数据的相同的分区键可能会成为访问比较多的节点。

正确选择表的分区键和聚类列是Cassandra中数据建模最重要的方面之一,它在很大程度上影响了可以执行哪些查询以及它们的效率。

5. Table Options

CQL表有许多选项可以在创建时设置, 这些选项在WITH关键字后面指定, 如CLUSTERING ORDER选项,该选项允许更改该聚类列的顺序,CLUSTERING ORDER选项采用逗号分隔的聚类列列表,每个列表具有ASC(升序)或DESC(降序)。支持的选项如下:

1542356392599935.png

Compaction options (压缩选项)如下:

压缩选项必须定义'class'子选项,该子选项定义要使用的压缩策略类。 默认支持的类是'SizeTieredCompactionStrategy'(STCS),'LeveledCompactionStrategy'(LCS)和'TimeWindowCompactionStrategy'(TWCS)。

Compression 选项如下:

1542356441183979.png

Caching 选项如下:

1542356467159575.png

6. Alter Table

更改现有表使用ALTER TABLE语句:

alter_table_statement   ::=  ALTER TABLE table_name alter_table_instruction
alter_table_instruction ::=  ADD column_name cql_type ( ',' column_name cql_type )*
                             | DROP column_name ( column_name )*
                             | WITH options

例如:

ALTER TABLE addamsFamily ADD gravesite varchar;
ALTER TABLE addamsFamily
       WITH comment = 'A most excellent and useful table'
       AND read_repair_chance = 0.2;

ALTER TABLE语句可以:

向表中添加新列(通过ADD指令):注意,无法更改表的主键,因此新添加的列将不会成为主键的一部分。

从表中删除列:删除列及其所有内容。

更改表的选项设置:(通过WITH指令)。支持的选项与创建表时相同。

7. DROP TABLE

删除表使用DROP TABLE语句:

drop_table_statement :: = DROP TABLE [IF EXISTS] table_name

删除表会立即删除表,包括它包含的所有数据。

如果该表不存在,则该语句将返回错误,除非使用IF EXISTS。

8. TRUNCATE

可以使用TRUNCATE语句清空表的内容:

truncate_statement :: = TRUNCATE [TABLE] table_name

允许TRUNCATE TABLE foo与其他DDL语句保持一致,Truncate 表会永久删除表中的所有现有数据,但不会删除表本身。

Cassandra 数据定义

发表评论

邮箱地址不会被公开。 必填项已用*标注

一 + 六 =

滚动到顶部