NoSQL和面向列的数据库之间有什么区别?

时间:2010-05-09 16:08:17

标签: database rdbms nosql column-oriented

我对NoSQL的了解越多,它就越像听起来像是一个面向列的数据库。

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

7 个答案:

答案 0 :(得分:12)

NoSQL Not Only SQL 的术语,涵盖四个主要类别 - 键值,文档,列族和图数据库

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

<强> e.g。 Redis,Riak等

文档数据库能够存储不同的属性以及大量数据

<强> e.g。 MongoDB,CouchDB等

列族数据库专为大量数据,读写性能和高可用性而设计

例如Cassandra,HBase等。

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

例如Neo4j,InfiniteGraph等。

在了解NoSQL之前,您必须了解一些关键概念。

一致性 - 系统中的所有服务器都将具有相同的数据,因此无论哪个服务器响应其请求,使用该系统的任何人都将获得相同的副本。

可用性 - 系统将始终响应请求(即使它不是最新数据或整个系统的一致性,或只是一条消息说系统无法正常工作)。

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

大多数情况下,NoSQL数据库只会满足三个属性中的两个。

从你的问题,

CouchDB AP (可用性和分区)&amp;文件数据库

Cassandra AP (可用性和分区)&amp;列族数据库

MongoDB CP (一致性和分区)&amp;文件数据库

Vertica CA (一致性和可用性)&amp;列族数据库

MonetDB ACID(原子一致性隔离持久性)&amp;关系数据库

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

enter image description here

对于选择特定类型数据库的各种方案,请查看此article1article2ppt

答案 1 :(得分:7)

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

例如,Vertica是一个面向列的关系数据库,因此它实际上不具备NoSQL数据存储的条件。

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

答案 2 :(得分:5)

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

面向列的数据库与传统的面向行的数据库不同,因为它们存储数据的方式。通过将整列存储在一起而不是一行,可以在从包含许多列的行中选择几列时最小化磁盘访问。在面向行的数据库中,如果只从一行中选择一个或所有字段,则没有区别。

你必须为更昂贵的插页付费。插入新行将导致许多磁盘操作,具体取决于列数。

但是在SQL,ACID,外键和类似的东西方面与传统数据库没有区别。

答案 3 :(得分:3)

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

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

文档还可以包含列表以及其他嵌套文档。这是来自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 ..." }
  ]
}

请注意&#34;评论&#34;是具有自己独立结构的嵌套文档列表。查询可以进入&#34;来自外部文档的这些文档,例如用于查找Jane发表评论的帖子,或者包含特定日期范围内评论的帖子。

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

答案 4 :(得分:1)

Distinguishing between coloumn stores阅读此博客。这回答了你的问题。

答案 5 :(得分:0)

正如@tuinstoel所写,article在第3点回答了你的问题:

  

第3。接口。 A组的特点是成为其中的一部分   NoSQL运动,通常不会   有一个传统的SQL界面。   B组支持标准SQL   接口

答案 6 :(得分:0)

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

  1. 您可以获得更好的压缩比,大小为10:1,因为您需要处理单一数据类型。
  2. 您可以获得更好的数据读取性能,因为您可以避免整行扫描,只需选择SELECT查询中指定的列。
  3. 另一方面,NoSQL是一个全新的数据库,它定义了“逻辑”聚合级别来解释数据。有些人将数据视为具有层次关系(聚合是“节点”),而另一些则将数据视为文档(这是聚合级别)。它们没有规定物理存储策略(有些可能会做,但是从最终用户那里抽象出来)。

    此外,整个NoSQL运动更多地与非结构化数据有关,或者更确切地说与其架构无法预定义或预先未知的数据集有关,因此无法符合严格的关系模型。

    面向列的数据库仍处理关系数据,但不需要索引等。