Cassandra - 数据模型


Cassandra 的数据模型与我们通常在 RDBMS 中看到的数据模型有很大不同。本章概述了 Cassandra 如何存储其数据。

Cassandra 数据库分布在一起运行的多台机器上。最外面的容器称为集群。对于故障处理,每个节点都包含一个副本,并且在发生故障时,由副本负责。Cassandra 将节点以环形格式排列在集群中,并向它们分配数据。

键空间

Keyspace 是 Cassandra 中最外层的数据容器。Cassandra 中键空间的基本属性是 -

  • 复制因子- 集群中将接收相同数据副本的机器数量。

  • 副本放置策略- 这只不过是在环中放置副本的策略。我们有简单策略(机架感知策略)、旧网络拓扑策略(机架感知策略)、网络拓扑策略(数据中心共享策略)等策略。

  • 列族- 键空间是一个或多个列族列表的容器。反过来,列族是行集合的容器。每行包含有序列。列族代表数据的结构。每个键空间至少有一个并且通常有多个列族。

创建键空间的语法如下 -

CREATE KEYSPACE Keyspace name
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

下图显示了 Keyspace 的示意图。

键空间

列族

列族是有序行集合的容器。每行又是列的有序集合。下表列出了列族与关系数据库表的区别点。

关系表 Cassandra 列系列
关系模型中的模式是固定的。一旦我们为表定义了某些列,在插入数据时,每一行中的所有列都必须至少填充空值。 在 Cassandra 中,虽然定义了列族,但列却没有定义。您可以随时将任何列自由添加到任何列族。
关系表仅定义列,用户在表中填写值。 在Cassandra中,表包含列,或者可以定义为超级列族。

Cassandra 列族具有以下属性 -

  • keys_cached - 它表示每个 SSTable 保留缓存的位置数。

  • rows_cached - 它表示其全部内容将被缓存在内存中的行数。

  • preload_row_cache - 它指定是否要预填充行缓存。

注意 -与列族架构不固定的关系表不同,Cassandra 不会强制单个行拥有所有列。

下图显示了 Cassandra 列族的示例。

Cassandra 列系列

柱子

列是 Cassandra 的基本数据结构,具有三个值,即键或列名称、值和时间戳。下面给出的是列的结构。

Cassandra的列结构

超级柱

超级列是一种特殊的列,因此,它也是一个键值对。但是超级列存储子列的映射。

通常,列族存储在磁盘上的单个文件中。因此,为了优化性能,将可能一起查询的列保留在同一个列族中非常重要,超级列在这里会很有帮助。下面给出的是超级列的结构。

Cassandra超级专栏

Cassandra 和 RDBMS 的数据模型

下表列出了 Cassandra 的数据模型与 RDBMS 的数据模型的区别点。

关系型数据库管理系统 Cassandra
RDBMS 处理结构化数据。 Cassandra 处理非结构化数据。
它有一个固定的模式。 Cassandra 具有灵活的架构。
在 RDBMS 中,表是数组的数组。(行 x 列) 在 Cassandra 中,表是“嵌套键值对”的列表。(行 x 列键 x 列值)
数据库是最外层的容器,包含与应用程序相对应的数据。 键空间是最外层的容器,包含与应用程序相对应的数据。
表是数据库的实体。 表或列族是键空间的实体。
行是 RDBMS 中的单个记录。 行是 Cassandra 中的复制单位。
列代表关系的属性。 列是 Cassandra 中的存储单位。
RDBMS 支持外键、连接的概念。 关系使用集合来表示。