Cassandra - 数据模型
Cassandra 的数据模型与我们通常在 RDBMS 中看到的模型有很大不同。本章概述了 Cassandra 如何存储其数据。
集群
Cassandra 数据库分布在多台共同运行的机器上。最外层的容器称为集群。为了处理故障,每个节点都包含一个副本,如果发生故障,副本将接管。Cassandra 以环形格式将节点排列在集群中,并将数据分配给它们。
Keyspace
Keyspace是 Cassandra 中数据的最外层容器。Cassandra 中Keyspace的基本属性是 −
复制因子 −它是集群中将接收相同数据副本的机器数量。
副本放置策略 − 它只不过是将副本放置在环中的策略。我们有简单策略(机架感知策略)、旧网络拓扑策略(机架感知策略)和网络拓扑策略(数据中心共享策略)等策略。
列族 − Keyspace是包含一个或多个列族列表的容器。而列族则是包含行集合的容器。每行包含有序列。列族表示数据的结构。每个Keyspace至少有一个列族,通常有多个列族。
创建Keyspace的语法如下 −
CREATE KEYSPACE Keyspace名称 WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
下图显示了Keyspace的示意图。
列族
列族是有序行集合的容器。反过来,每一行都是有序列的集合。下表列出了列族与关系数据库表的区别。
关系表 | Cassandra 列族 |
---|---|
关系模型中的模式是固定的。一旦我们为表定义了某些列,在插入数据时,每行中的所有列都必须至少填充一个空值。 | 在 Cassandra 中,虽然定义了列族,但没有定义列。您可以随时自由地将任何列添加到任何列族中。 |
关系表仅定义列,用户用值填充表。 | 在 Cassandra 中,表包含列,也可以定义为超级列族。 |
Cassandra 列族具有以下属性 −
keys_cached − 它表示每个 SSTable 中要保留缓存的位置数。
rows_cached − 它表示将全部内容缓存在内存中的行数。
preload_row_cache −它指定是否要预填充行缓存。
注意 − 与列族模式不固定的关系表不同,Cassandra 不会强制各个行包含所有列。
下图显示了 Cassandra 列族的示例。
列
列是 Cassandra 的基本数据结构,具有三个值,即键或列名、值和时间戳。下面给出了列的结构。
SuperColumn
超级列是一种特殊列,因此,它也是一个键值对。但超级列存储的是子列的映射。
通常,列族存储在磁盘上的单个文件中。因此,为了优化性能,将可能一起查询的列放在同一个列族中非常重要,而超级列在这里会很有帮助。下面给出了超级列的结构。
Cassandra 和 RDBMS 的数据模型
下表列出了 Cassandra 数据模型与 RDBMS 数据模型的区别。
RDBMS | Cassandra |
---|---|
RDBMS 处理结构化数据。 | Cassandra 处理非结构化数据。 |
它有一个固定的模式。 | Cassandra 具有灵活的模式。 |
在 RDBMS 中,表是数组的数组。(行 x 列) | 在 Cassandra 中,表是"嵌套键值对"的列表。 (行 x 列键 x 列值) |
数据库是包含与应用程序对应的数据的最外层容器。 | Keyspace是包含与应用程序对应的数据的最外层容器。 |
表是数据库的实体。 | 表或列族是Keyspace的实体。 |
行是 RDBMS 中的单个记录。 | 行是 Cassandra 中的复制单位。 |
列表示关系的属性。 | 列是 Cassandra 中的存储单位。 |
RDBMS 支持外键的概念,连接。 | 关系使用集合来表示。 |