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的分区行存储意味着它实际上是列族而非列式的。列族的主要特征是列信息是数据的一部分,这是列族模型与行式和列式模型之间的主要区别。术语宽列源自无限列数的表本质上是宽的这一概念。
我们还探讨了列族数据存储中的行不需要共享列名或列号,这使得无模式或半结构化的表成为可能。