我对NoSQL的了解越多,对于我而言,它就越像是一个面向列的数据库。NoSQL和Column-Oriented数据库有什么区别?
NoSQL(例如CouchDB,Cassandra,MongoDB)和列式数据库(例如Vertica,MonetDB)之间的区别是什么?
我对NoSQL的了解越多,对于我而言,它就越像是一个面向列的数据库。NoSQL和Column-Oriented数据库有什么区别?
NoSQL(例如CouchDB,Cassandra,MongoDB)和列式数据库(例如Vertica,MonetDB)之间的区别是什么?
有些NoSQL数据库是列式数据库,有些SQL数据库也是列式的。无论数据库是列还是面向行是数据库的物理存储实现细节,对于关系数据库和非关系数据库(NoSQL)都是如此。
例如,Vertica是一个面向列的关系数据库,因此它实际上不会被认定为NoSQL数据存储。
“NoSQL移动”数据存储被定义为非关系型,无共享,水平可伸缩的数据库,没有(必然)ACID保证。一些列式数据库可以用这种方式表征。除了列存储之外,NoSQL实现还包括文档存储,对象存储,元组存储和图形存储。
由于@tuinstoel写道,在article回答了3点你的问题:
3.接口。 A组的特点是作为NoSQL移动的 的一部分,并且通常不具有传统的SQL接口 。 B组支持标准SQL 接口。
NoSQL数据库与传统的基于模式的数据库是不同的范例。它们旨在扩展和保存json数据等文档。很显然,他们有一种查询信息的方式,但是你应该期待像eval(“person = * and age> 10)”这样的语法来检索数据,即使它们支持标准的SQL接口,它们也是用于其他的,所以如果你喜欢SQL你应该坚持传统的数据库
一个面向列的数据库不同于传统的面向行的数据库,因为它们存储数据的方式,通过将整列而不是一行存储在一起,可以在选择在行数据库中,如果你只选择一行或一行中的一个或多个字段,则没有区别
虽然你必须支付更昂贵的插入,但插入一个新行会导致许多磁盘操作取决于列数。
但是在SQL,ACID,外键等方面与传统数据库没有区别。
我建议您阅读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数据库典型的两个主要差异是缺少超出传统行/列数据库二维方向的(正式)模式和内容。
下面是我的看法:面向列的数据库正在处理数据在物理上存储在磁盘上的方式。顾名思义,每一列都存储在自己独立的空间/文件中。这允许2件重要的事情:
另一方面,NoSQL是定义“逻辑”聚合级别以解释数据的全新数据库。有些人认为数据具有层次关系(聚合是一个“节点”),而另一些则将数据视为文档(这是聚合级别)。他们不会规定物理存储策略(有些可能会这样做,但会从最终用户身上抽象出来)。另外,整个NoSQL运动更多地与非结构化数据有关,或者更确切地说,数据集的模式不能预先定义,或者事先未知,因此不符合严格的关系模型。
面向列的数据库仍在处理关系型数据,虽然消除了对指数等
Distinguishing between coloumn stores阅读这篇博客的需要。这回答你的问题。
的NoSQL是用于并非只有SQL,涵盖四大类的名词 - 键值,文档,柱族和图形数据库。
键值数据库非常适合频繁小型读写的应用程序以及简单的数据模型。 这些记录使用唯一标识记录的密钥进行存储和检索,并用于快速查找数据库中的数据。
例如Redis,Riak等
文献数据库具有存储不同属性具有大量数据
例如沿着能力MongoDB中,CouchDB的等
列家庭数据库是专为大量数据,读取和写入性能和高可用性
如卡珊德拉,HBase的等
图数据库是一个数据库,它使用图结构进行语义查询,使用节点,边和属性来表示和存储数据
e.g的Neo4j,InfiniteGraph等
在了解NoSQL的,你必须要了解一些关键概念。
一致性 - 系统中的所有服务器将具有相同的数据,因此使用该系统的任何人都将获得相同的副本,而不管哪个服务器应答他们的请求。
可用性 - 系统将始终对请求做出响应(即使它不是最新的数据或整个系统的一致性,或者只是表示系统不工作的消息)。
分区容差 - 即使单个服务器发生故障或无法联系,系统仍会继续作为一个整体运行。
大多数时候,NoSQL数据库只能满足三个属性之上的两个属性。
从你的问题,
CouchDB的:AP(可用性&分区)&文档数据库
卡桑德拉:AP(可用性&分区)&列家族数据库
MongoDB的:CP(一致性&分区)&文档数据库
Vertica的:CA(一致性&可用性)&列家族数据库
MonetDB:ACID(原子性一致性隔离耐久度) &关系数据库
区分两种类型的列存储:http://dbmsmusings.blogspot.com/2010/03/distinguishing-two-major-types-of_29.html – tuinstoel 2010-05-09 18:04:11
结构化(列)与非结构化/半结构化(列) NoSQL的)。像这样想想。 – 2014-01-14 18:40:08