列式数据库应该将一组列存储在一起。但Cassandra按行存储数据。SS表将保存Map到其相应分区键的多行数据。所以我觉得Cassandra像MySQL一样是一个行明智的数据存储,但有其他好处,比如“宽行”,每个列不一定都存在于所有行中,当然它在内存中。如果我说错了请纠正我。
ghhaqwfi1#
如果您转到Apache Cassandra project on GitHub,向下滚动到“Executive Summary”,您将得到您的答案:Cassandra是一个分区行存储。行被组织成具有所需主键的表。分区意味着Cassandra可以在应用程序透明的情况下将数据分布在多台机器上。Cassandra会在集群中添加和删除机器时自动重新分区。行存储意味着像关系数据库一样,Cassandra按行和列组织数据。“所以我觉得Cassandra是一个行式数据存储”这是正确的。
nzk0hqpo2#
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;
Bonuses: { row1: { "ID":1, "Last":"Doe", "First":"John", "Bonus":8000}, row2: { "ID":2, "Last":"Smith", "Jane":"John", "Bonus":4000} ... }
希望这能帮上忙。
nbnkbykc3#
把cassandra看作一个Map的Map,其中内部Map是按键排序的。一个分区有许多列,它们总是存储在一起。它们按聚类键排序-首先按第一个键排序,然后按下一个键排序,然后按下一个键排序......以此类推。然后在副本之间复制分区。它不一定存储为“行”,因为不同的行基于复制策略和主动散列算法存储在不同的节点上。换句话说,如果ProductId是分区键,则ProductId 1的分区可能不会存储在ProductId 2旁边。但是,产品ID为1的列始终存储在一起。至于定义,大多数NoSQL存储都以这样或那样的方式模糊了界限。它们通常跨越多个类别。我将由您来决定这是否符合列式数据库的条件:)
o4hqfura4#
它是一个宽列数据库,也称为列族数据库。维基百科的定义也有助于进一步:宽列存储,如Bigtable和Apache Cassandra,在术语的原始意义上不是列存储,因为它们的两级结构不使用列式数据布局。在真正的列存储中,采用列式数据布局,使得每个列单独存储在磁盘上。宽列存储通常支持单独存储的列族的概念。然而,每个这样的列族通常包含一起使用的多个列,类似于传统的关系数据库表。在给定列族内,所有数据以逐行方式存储,使得给定行的列存储在一起,而不是每列单独存储。支持列族的宽列存储也称为列族数据库。参考:https://en.wikipedia.org/wiki/Wide-column_store
czq61nw15#
Cassandra有列族的概念,但它不是面向列的。
引用我读过的最好的书的一部分:《设计数据密集型应用程序》,Martin Kleppmann著:Cassandra和HBase有一个列族的概念,这是他们从Bigtable继承的。然而,称它们为面向列是非常误导的:在每个列族中,它们将来自行的所有列连同行键一起存储在一起,并且它们不使用列压缩。因此,Bigtable模型仍然主要是面向行的。
5条答案
按热度按时间ghhaqwfi1#
如果您转到Apache Cassandra project on GitHub,向下滚动到“Executive Summary”,您将得到您的答案:
Cassandra是一个分区行存储。行被组织成具有所需主键的表。
分区意味着Cassandra可以在应用程序透明的情况下将数据分布在多台机器上。Cassandra会在集群中添加和删除机器时自动重新分区。
行存储意味着像关系数据库一样,Cassandra按行和列组织数据。
“所以我觉得Cassandra是一个行式数据存储”
这是正确的。
nzk0hqpo2#
**例如:**表
Bonuses
表1,Doe,John,8000;2,Smith,Jane,4000;3,Beck,Sam,1000;
1,2,3;Doe,Smith,Beck;John,Jane,Sam;8000,4000,1000;
Bonuses: { row1: { "ID":1, "Last":"Doe", "First":"John", "Bonus":8000}, row2: { "ID":2, "Last":"Smith", "Jane":"John", "Bonus":4000} ... }
希望这能帮上忙。
nbnkbykc3#
把cassandra看作一个Map的Map,其中内部Map是按键排序的。一个分区有许多列,它们总是存储在一起。它们按聚类键排序-首先按第一个键排序,然后按下一个键排序,然后按下一个键排序......以此类推。然后在副本之间复制分区。它不一定存储为“行”,因为不同的行基于复制策略和主动散列算法存储在不同的节点上。换句话说,如果ProductId是分区键,则ProductId 1的分区可能不会存储在ProductId 2旁边。但是,产品ID为1的列始终存储在一起。
至于定义,大多数NoSQL存储都以这样或那样的方式模糊了界限。它们通常跨越多个类别。我将由您来决定这是否符合列式数据库的条件:)
o4hqfura4#
它是一个宽列数据库,也称为列族数据库。维基百科的定义也有助于进一步:
宽列存储,如Bigtable和Apache Cassandra,在术语的原始意义上不是列存储,因为它们的两级结构不使用列式数据布局。在真正的列存储中,采用列式数据布局,使得每个列单独存储在磁盘上。宽列存储通常支持单独存储的列族的概念。然而,每个这样的列族通常包含一起使用的多个列,类似于传统的关系数据库表。在给定列族内,所有数据以逐行方式存储,使得给定行的列存储在一起,而不是每列单独存储。支持列族的宽列存储也称为列族数据库。
参考:https://en.wikipedia.org/wiki/Wide-column_store
czq61nw15#
简短回答:
Cassandra有列族的概念,但它不是面向列的。
长回答:
引用我读过的最好的书的一部分:《设计数据密集型应用程序》,Martin Kleppmann著:
Cassandra和HBase有一个列族的概念,这是他们从Bigtable继承的。然而,称它们为面向列是非常误导的:在每个列族中,它们将来自行的所有列连同行键一起存储在一起,并且它们不使用列压缩。因此,Bigtable模型仍然主要是面向行的。