Cassandra是一个列式数据库还是列式数据库?

24

列式数据库应该将一组列存储在一起。但是Cassandra以行为单位存储数据。 SS表将多行数据映射到它们对应的分区键。因此,我认为Cassandra是像MySQL一样的行式数据存储,但具有其他好处,比如“宽行”,并且不是所有行都必须出现所有列,并且当然是在内存中。如果我错了,请纠正我。

5个回答

34
如果你访问GitHub上的Apache Cassandra项目,并向下滚动到“Executive Summary”一节,你将得到答案:

Cassandra是一个分区行存储器。行被组织成具有必需主键的表。

分区意味着Cassandra可以在应用程序透明的情况下将您的数据分布到多台机器上。当集群中添加或删除机器时,Cassandra会自动重新分区。

行存储意味着像关系型数据库一样,Cassandra按行和列组织数据。

“所以我觉得Cassandra是一种按行存储数据的方式。”

这是正确的。


1
那么Cassandra不能直接与HBASE进行比较,后者最终是一个列式数据库。也许在HBASE中,数据被存储为区域,这只是列族行的列表。(基于列族的垂直分割) - saktheesh
3
@RajSaraogi 不错的发现!我无法确定亚马逊在这种情况下文档的意图。但我可以告诉你,将Cassandra归类为这种类型是一个常见的误解。他们链接到“Apache Cassandra on AWS Whitepaper”(http://d0.awsstatic.com/whitepapers/AWS_Cassandra_Whitepaper.pdf)的事实是,Cassandra不是列数据库,这更增加了混淆。我只能得出结论,他们的文档并不是非常准确。 - Aaron

32
  • 在列式数据库中,数据以列为单位存储在磁盘上。

    例如: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等一些列导向的数据库。阅读这篇文章以获取更多细节。希望对你有所帮助。

“column-family”和“wide-column”是相同的吗?在这个例子中,我认为“Bonuses”将是Cassandra中的一个表,其中“row1”、“row2”形成了分区/主键。而“ID”、“Last”等则是列,它们是宽列吗?也就是说,在每个这些列中是否可以添加更多不同的列? - Manu Chadha

3
Cassandra可以看作是一个嵌套映射(map of maps),其中内部映射按键排序。一个分区包含许多列,它们总是一起存储。这些列按聚簇键排序——首先是第一个键,然后是下一个,接着是下一个...以此类推。然后将分区在副本之间复制。它不一定被存储为“行”,因为根据复制策略和活动哈希算法,不同的行存储在不同的节点上。换句话说,如果ProductId是分区键,则ProductId 1的分区可能不会与ProductId 2相邻。但是,ProductId 1的列总是一起存储。
至于定义,大多数NoSQL存储都在某种程度上模糊了界限。它们通常涵盖多个类别。我会让您自己决定是否符合列式数据库的资格 :)

3
它是一种宽列数据库,也被称为列族数据库。 来自维基百科的定义可以更好地解释这一点:
广泛使用Bigtable和Apache Cassandra等宽列存储不是传统意义上的列存储,因为它们的双层结构不使用列式数据布局。在真正的列式存储中,采用列式数据布局,以便每个列单独存储在磁盘上。宽列存储通常支持分别存储的“列族”概念。然而,每个此类列族通常包含多个一起使用的列,类似于传统的关系型数据库表。在给定的列族中,所有数据都以行方式存储,使得给定行的列存储在一起,而不是每列单独存储。支持列族的宽列存储也称为列族数据库。
参考:https://en.wikipedia.org/wiki/Wide-column_store

1

简短回答:

Cassandra拥有列族(column family)的概念,但它不是面向列(column-oriented)的。

长回答:

引用我读过的最好的一本书《设计数据密集型应用》(作者Martin Kleppmann)中的部分内容:

Cassandra和HBase都有列族(column families)的概念,这一概念是从Bigtable继承而来的。然而,将它们称为面向列(column-oriented)是非常误导人的:在每个列族中,它们将一行中的所有列连同行键一起存储,并且它们不使用列压缩。因此,Bigtable模型仍然主要是面向行(row-oriented)的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接