为什么许多是指卡桑德拉作为面向列的数据库?(Why many refer to Cassandra

2019-07-01 17:10发布

读了多篇论文和文件,互联网上,我发现对Cassandra的数据模型的许多矛盾的信息。 有许多其识别为一个面向列的数据库,其他为行导向,那么谁把它定义为两者的混合方式。

据我了解卡桑德拉如何存储文件的东西,它使用* -Index.db文件访问的* -Data.db文件的正确位置,在其存储在布隆过滤器,列索引,然后的列所需的行。

在我看来,这是严格面向行的。 是否有什么我失踪?

Answer 1:

是的,“面向列的”术语是有点混乱。

在卡桑德拉的模型是行包含列。 要访问数据的最小单位(列),你必须指定第一行名称(键),则列名。

因此,在一个名为的ColumnFamily Fruit ,你可以像下面的例子中的结构(2行),那里的水果类型是行键,并且每一列有一个名字和值。

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

orange -> colour    weight  price  origin
          "orange"  120     50     "Spain"

从基于表格的关系型数据库的一个区别是,人们可以在任何时间忽略列(橙子却毫无品种),或添加任意列(橙色具有原点)。 你仍然可以想像,上述数据为表,虽然稀疏一个有许多值可能是空的。

然而,“面向列的”模式也可用于名单和时间序列,其中每列名是唯一的(在这里,我们只有一个排,但我们可以有列十万或数百万):

temperature ->  2012-09-01  2012-09-02  2012-09-03 ...
                40          41          39         ...

这是一个关系模型,其中一个必须的时间序列中的条目建模为完全不同的rowscolumns 。 这种类型的用途通常被称为“宽行”。



Answer 2:

  • 如果你看看在自述文件的Apache 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是基本上是列家族

  • 卡桑德拉将存储在上述数据, "Bounses" : { row1 : { "ID":1, "Last":"Doe", "First":"John", "Bonus":8000}, row2 : { "ID":2, "Last":"Smith", "First":"Jane", "Bonus":4000} ... }
  • 阅读此了解更多详情。

希望这可以帮助。



Answer 3:

你们都好好点,它可能会造成混淆。 在该例子

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

苹果是密钥值和列是数据,其中包含所有4个数据项。 从被形容这听起来像所有4个数据项作为一个对象,然后由应用程序解析拉只是所需的值存储在一起。 因此,从一个IO透视我需要读取整个对象。 IMHO这是固有的行(或对象)基于不基于列的。

基于列的存储走红仓储,因为它提供了极度压缩和减少IO全​​表扫描(DW),但在增加IO的OLTP的成本​​时,你需要拉每列(SELECT *)。 绝大多数的查询并不需要每列,由于压缩IO可用于只有几列全表扫描大打折扣。 让我提供一个例子

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

grape -> colour  weight  price variety
         "red"   100     40    "Cox"

我们有两个不同的水果,但两者有一个颜色=红色。 如果我们存储的颜色在一个单独的磁盘页(块)的重量,价格和品种,从而存储的仅仅是颜色,那么当我们压缩页面,我们可以因大量的重复数据删除的实现极端压缩。 相反,在一个页面中存储100行(假设),我们可存储万色的。 我们读到的一切与红色这可能是1 IO,而不是成千上万的IO的这对仓库和分析确实不错,但不适合OLTP如果我需要更新整个行,因为该行可能有几百列和单一的更新(或插入)可能需要数百IO的的。

除非我失去了一些东西,我不会把这种柱状基础,我叫它基于对象的。 它仍然不是对象是如何安排磁盘上清晰。 多个对象置于同一磁盘页面? 是否能保证具有相同的元数据一起去的对象的任何方式? 要一个水果可能含有因为它只是元数据或XML或任何你想要的对象本身存储比其他水果不同的数据来看,有没有办法保证一定的匹配果实类型存储在一起,以提高效率?

拉里



Answer 4:

柱族并不意味着它是面向列。 Cassandra是列的家庭,但不面向列的。 它存储所有的列族共同的行。

HBase的是列族以及在面向列的时装店列族。 不同列族被分别存储在一个节点,或者它们甚至可以驻留在不同节点上。



Answer 5:

最明确的期限我所遇到的是宽列存储

它是一种二维的key-value存储的,在您使用的行密钥和列密钥来访问数据。

此模型和关系者之间的主要区别(包括行导向和面向列的)是该列信息是所述数据的一部分

这意味着数据可以是稀疏 。 这意味着不同的行并不需要共享相同的列名也不列数。 这使得半结构化数据或模式自由表。

你能想到的宽列存储为可容纳列的数量不受限制,因此表都很宽。

这里有几个链接来支持这一行动:

  • 这MongoDB的文章
  • 这Datastax文章中提到过它,尽管它归类卡桑德拉作为key-value存储。
  • 该DB-引擎文章
  • 这2013条
  • 维基百科


文章来源: Why many refer to Cassandra as a Column oriented database?