列式数据库应该将一组列存储在一起。但是 Cassandra 按行存储数据。SS Table 将保存多行数据映射到其对应的分区键。所以我觉得 Cassandra 是一个像 MySQL 一样的行明智的数据存储,但还有其他好处,比如“宽行”,每一列不一定都存在于所有行中,当然它在内存中。如果我错了,请纠正我。
4 回答
如果您访问GitHub 上的 Apache Cassandra 项目,并向下滚动到“执行摘要”,您将得到答案:
Cassandra 是一个分区的行存储。行被组织成具有所需主键的表。
分区意味着 Cassandra 可以在应用程序透明的情况下将您的数据分布在多台机器上。Cassandra 将在集群中添加和删除机器时自动重新分区。
行存储意味着像关系数据库一样,Cassandra 按行和列组织数据。
“所以我觉得 Cassandra 是一个行式数据存储”
那是正确的。
在面向列或列式数据库中,数据以列方式存储在磁盘上。
例如
Bonuses
:表表ID Last First Bonus 1 Doe John 8000 2 Smith Jane 4000 3 Beck Sam 1000
在面向行的数据库管理系统中,数据将像这样存储:
1,Doe,John,8000;2,Smith,Jane,4000;3,Beck,Sam,1000;
在面向列的数据库管理系统中,数据将像这样存储:
1,2,3;Doe,Smith,Beck;John,Jane,Sam;8000,4000,1000;
Cassandra 基本上是一个列式存储
Cassandra 会将上述数据存储为:
Bonuses: { row1: { "ID":1, "Last":"Doe", "First":"John", "Bonus":8000}, row2: { "ID":2, "Last":"Smith", "Jane":"John", "Bonus":4000} ... }
Vertica、VectorWise、MonetDB 是我听说过的一些面向列的数据库。
阅读本文了解更多详情。
希望这可以帮助。
考虑 cassandra 的一种好方法是将其视为映射的映射,其中内部映射按键排序。一个分区有很多列,并且它们总是存储在一起。它们按聚类键排序 - 首先按第一个键,然后是下一个,然后是下一个……依此类推。然后在副本之间复制分区。它不一定存储为“行”,因为不同的行基于复制策略和主动散列算法存储在不同的节点上。换句话说,如果 ProductId 是分区键,则 ProductId 1 的分区可能不会存储在 ProductId 2 旁边。但是,产品 ID 1 的列始终存储在一起。
至于定义,大多数 NoSQL 存储都以一种或另一种方式模糊了界限。它们通常跨越多个类别。我将由您决定这是否符合列式数据库的条件:)
它是一个宽列数据库,也被称为列族数据库。维基百科的定义也有助于进一步:
Bigtable 和 Apache Cassandra 等宽列存储并不是该术语最初意义上的列存储,因为它们的两级结构不使用列式数据布局。在真正的列存储中,采用列式数据布局,每列单独存储在磁盘上。宽列存储通常支持单独存储的列族的概念。但是,每个这样的列族通常包含多个一起使用的列,类似于传统的关系数据库表。在给定的列族中,所有数据都以逐行方式存储,以便给定行的列存储在一起,而不是每列单独存储。支持列族的宽列存储也称为列族数据库。