1. 引言

Apache Cassandra 是一个开源分布式NoSQL数据库,专为多数据中心处理大量数据而设计。Cassandra的数据模型在多个文档和论文中被讨论,常常导致信息混乱或相互矛盾。这主要是因为Cassandra能够独立存储和访问列族,从而被误认为是列式数据库,而非列族数据库。

在这个教程中,我们将探讨数据模型之间的差异,并确定Cassandra的分区行存储数据模型的本质。

2. 数据库数据模型

Apache Cassandra GitHub仓库的README文件中提到:

Cassandra is a partitioned row store. Rows are organized into tables with a required primary key.

Partitioning means that Cassandra can distribute your data across multiple machines in an application-transparent matter. Cassandra will automatically repartition as machines are added and removed from the cluster.

Row store means that like relational databases, Cassandra organizes data by rows and columns.

据此,我们可以得出结论,Cassandra是一个****分区行存储数据库。然而,列族宽列也是合适的名称,我们将在下面的内容中进一步了解。

列族数据模型与列式模型并不相同。列族数据库会将一行及其所有列族一起存储,而列式数据库则是按列而不是按行存储数据表。

2.1. 行式和列式数据存储

员工表为例:

  ID         Last    First   Age
  1          Cooper  James   32
  2          Bell    Lisa    57
  3          Young   Joseph  45

行式数据库将这些数据存储为:

1,Cooper,James,32;2,Bell,Lisa,57;3,Young,Joseph,45;

而列式数据库则存储为:

1,2,3;Cooper,Bell,Young;James,Lisa,Joseph;32,57,45;

Cassandra并不像行式或列式数据库那样存储数据。

2.2. 分区行存储

Cassandra使用分区行存储,这意味着行包含列。列族数据库通过将键映射到值并将值分组到多个列族中来存储数据。

分区行存储中,员工数据看起来像这样:

"Employees" : {
           row1 : { "ID":1, "Last":"Cooper", "First":"James", "Age":32},
           row2 : { "ID":2, "Last":"Bell", "First":"Lisa", "Age":57},
           row3 : { "ID":3, "Last":"Young", "First":"Jospeh", "Age":45},
           ...
     }

分区行存储的行包含列,但每行的列数不必相同(类似于大表)。有些行可能有数千个列,而有些行可能仅限于一个。

我们可以将分区行存储视为二维键值存储,其中使用行键和列键来访问数据。要访问最小的数据单元(即列),必须首先指定行名(键)然后是列名。

3. 总结

在这篇文章中,我们了解到Cassandra的分区行存储意味着它实际上是列族而非列式的。列族的主要特征是列信息是数据的一部分,这是列族模型与行式和列式模型之间的主要区别。术语宽列源自无限列数的表本质上是宽的这一概念。

我们还探讨了列族数据存储中的行不需要共享列名或列号,这使得无模式半结构化的表成为可能。