2010-05-09 139 views
18

我对NoSQL的了解越多,对于我而言,它就越像是一个面向列的数据库。NoSQL和Column-Oriented数据库有什么区别?

NoSQL(例如CouchDB,Cassandra,MongoDB)和列式数据库(例如Vertica,MonetDB)之间的区别是什么?

+3

区分两种类型的列存储:http://dbmsmusings.blogspot.com/2010/03/distinguishing-two-major-types-of_29.html – tuinstoel 2010-05-09 18:04:11

+0

结构化(列)与非结构化/半结构化(列) NoSQL的)。像这样想想。 – 2014-01-14 18:40:08

回答

7

有些NoSQL数据库是列式数据库,有些SQL数据库也是列式的。无论数据库是列还是面向行是数据库的物理存储实现细节,对于关系数据库和非关系数据库(NoSQL)都是如此。

例如,Vertica是一个面向列的关系数据库,因此它实际上不会被认定为NoSQL数据存储。

“NoSQL移动”数据存储被定义为非关系型,无共享,水平可伸缩的数据库,没有(必然)ACID保证。一些列式数据库可以用这种方式表征。除了列存储之外,NoSQL实现还包括文档存储,对象存储,元组存储和图形存储。

0

由于@tuinstoel写道,在article回答了3点你的问题:

3.接口。 A组的特点是作为NoSQL移动的 的一部分,并且通常不具有传统的SQL接口 。 B组支持标准SQL 接口。

5

NoSQL数据库与传统的基于模式的数据库是不同的范例。它们旨在扩展和保存json数据等文档。很显然,他们有一种查询信息的方式,但是你应该期待像eval(“person = * and age> 10)”这样的语法来检索数据,即使它们支持标准的SQL接口,它们也是用于其他的,所以如果你喜欢SQL你应该坚持传统的数据库

一个面向列的数据库不同于传统的面向行的数据库,因为它们存储数据的方式,通过将整列而不是一行存储在一起,可以在选择在行数据库中,如果你只选择一行或一行中的一个或多个字段,则没有区别

虽然你必须支付更昂贵的插入,但插入一个新行会导致许多磁盘操作取决于列数。

但是在SQL,ACID,外键等方面与传统数据库没有区别。

3

我建议您阅读NoSQL维基百科条目的taxonomy section,以了解NoSQL数据库与传统的面向模式数据库的不同之处。面向列意味着行和列,这意味着一个(二维)模式,而NoSQL数据库往往是无模式(键值存储)或具有结构化内容但没有正式模式(文档存储)。

对于文档商店,每个“文档”的结构和内容独立于同一“集合”中的其他文档。添加字段通常是代码更改,而不是数据库更改:新文档会为新字段获取条目,而旧文档会被视为不存在字段的空值。同样,“删除”字段可能意味着您只需停止在代码中引用它,而不必从每个文档中删除它(除非空间有限),然后您可以选择只删除那些最大的内容)。与此相比,必须更改整个表以添加或删除传统行/列数据库中的列。

文档还可以包含列表以及其他嵌套文档。下面是MongoDB的样本文档(从博客或其它论坛后),表示为JSON:

{ 
    _id : ObjectId("4e77bb3b8a3e000000004f7a"), 
    when : Date("2011-09-19T02:10:11.3Z"), 
    author : "alex", 
    title : "No Free Lunch", 
    text : "This is the text of the post. It could be very long.", 
    tags : [ "business", "ramblings" ], 
    votes : 5, 
    voters : [ "jane", "joe", "spencer", "phyllis", "li" ], 
    comments : [ 
    { who : "jane", when : Date("2011-09-19T04:00:10.112Z"), 
     comment : "I agree." }, 
    { who : "meghan", when : Date("2011-09-20T14:36:06.958Z"), 
     comment : "You must be joking. etc etc ..." } 
    ] 
} 

注“意见”是如何用自己的独立结构嵌套文档的列表。查询可以从外部文档“进入”这些文档,例如查找由Jane发表评论的帖子,或者查找来自某个日期范围的评论的帖子。

简而言之,NoSQL数据库典型的两个主要差异是缺少超出传统行/列数据库二维方向的(正式)模式和内容。

0

下面是我的看法:面向列的数据库正在处理数据在物理上存储在磁盘上的方式。顾名思义,每一列都存储在自己独立的空间/文件中。这允许2件重要的事情:

  1. 由于您有单一的数据类型来处理,您可以获得更好的压缩比,达到10:1的数量级。
  2. 您可以获得更好的数据读取性能,因为您可以避免整行扫描,并且只需选取SELECT查询中指定的列即可。

另一方面,NoSQL是定义“逻辑”聚合级别以解释数据的全新数据库。有些人认为数据具有层次关系(聚合是一个“节点”),而另一些则将数据视为文档(这是聚合级别)。他们不会规定物理存储策略(有些可能会这样做,但会从最终用户身上抽象出来)。另外,整个NoSQL运动更多地与非结构化数据有关,或者更确切地说,数据集的模式不能预先定义,或者事先未知,因此不符合严格的关系模型。

面向列的数据库仍在处理关系型数据,虽然消除了对指数等

5

的NoSQL是用于并非只有SQL,涵盖四大类的名词 - 键值,文档,柱族和图形数据库

键值数据库非常适合频繁小型读写的应用程序以及简单的数据模型。 这些记录使用唯一标识记录的密钥进行存储和检索,并用于快速查找数据库中的数据。

例如Redis,Riak等

文献数据库具有存储不同属性具有大量数据

例如沿着能力MongoDB中,CouchDB的等

列家庭数据库是专为大量数据,读取和写入性能和高可用性

如卡珊德拉,HBase的等

数据库是一个数据库,它使用图结构进行语义查询,使用节点,边和属性来表示和存储数据

e.g的Neo4j,InfiniteGraph等

在了解NoSQL的,你必须要了解一些关键概念。

一致性 - 系统中的所有服务器将具有相同的数据,因此使用该系统的任何人都将获得相同的副本,而不管哪个服务器应答他们的请求。

可用性 - 系统将始终对请求做出响应(即使它不是最新的数据或整个系统的一致性,或者只是表示系统不工作的消息)。

分区容差 - 即使单个服务器发生故障或无法联系,系统仍会继续作为一个整体运行。

大多数时候,NoSQL数据库只能满足三个属性之上的两个属性。

从你的问题,

CouchDB的AP(可用性&分区)&文档数据库

卡桑德拉AP(可用性&分区)&列家族数据库

MongoDB的CP(一致性&分区)&文档数据库

Vertica的CA(一致性&可用性)&列家族数据库

MonetDBACID(原子性一致性隔离耐久度) &关系数据库

来源:http://blog.nahurst.com/visual-guide-to-nosql-systems

enter image description here

看一看这个article1article2ppt了各种方案来选择特定类型的数据库。