读了多篇论文和文件,互联网上,我发现对Cassandra的数据模型的许多矛盾的信息。 有许多其识别为一个面向列的数据库,其他为行导向,那么谁把它定义为两者的混合方式。
据我了解卡桑德拉如何存储文件的东西,它使用* -Index.db文件访问的* -Data.db文件的正确位置,在其存储在布隆过滤器,列索引,然后的列所需的行。
在我看来,这是严格面向行的。 是否有什么我失踪?
读了多篇论文和文件,互联网上,我发现对Cassandra的数据模型的许多矛盾的信息。 有许多其识别为一个面向列的数据库,其他为行导向,那么谁把它定义为两者的混合方式。
据我了解卡桑德拉如何存储文件的东西,它使用* -Index.db文件访问的* -Data.db文件的正确位置,在其存储在布隆过滤器,列索引,然后的列所需的行。
在我看来,这是严格面向行的。 是否有什么我失踪?
是的,“面向列的”术语是有点混乱。
在卡桑德拉的模型是行包含列。 要访问数据的最小单位(列),你必须指定第一行名称(键),则列名。
因此,在一个名为的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 ...
这是一个关系模型,其中一个必须的时间序列中的条目建模为完全不同的rows
不columns
。 这种类型的用途通常被称为“宽行”。
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} ... }
希望这可以帮助。
你们都好好点,它可能会造成混淆。 在该例子
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或任何你想要的对象本身存储比其他水果不同的数据来看,有没有办法保证一定的匹配果实类型存储在一起,以提高效率?
拉里
柱族并不意味着它是面向列。 Cassandra是列的家庭,但不面向列的。 它存储所有的列族共同的行。
HBase的是列族以及在面向列的时装店列族。 不同列族被分别存储在一个节点,或者它们甚至可以驻留在不同节点上。
最明确的期限我所遇到的是宽列存储 。
它是一种二维的key-value存储的,在您使用的行密钥和列密钥来访问数据。
此模型和关系者之间的主要区别(包括行导向和面向列的)是该列信息是所述数据的一部分 。
这意味着数据可以是稀疏 。 这意味着不同的行并不需要共享相同的列名也不列数。 这使得半结构化数据或模式自由表。
你能想到的宽列存储为可容纳列的数量不受限制,因此表都很宽。
这里有几个链接来支持这一行动: