NoSQL和列式数据库有什么区别?

29

我越读关于NoSQL的资料,就越觉得它听起来像是一种列式数据库。

NoSQL(例如CouchDB、Cassandra、MongoDB)和列式数据库(例如Vertica、MonetDB)有什么区别呢?


4
区分了两种列式存储:http://dbmsmusings.blogspot.com/2010/03/distinguishing-two-major-types-of_29.html - tuinstoel
结构化(列式)与非结构化/半结构化(nosql)的区别。可以这样考虑。 - Up_One
7个回答

23

NoSQL 是一个术语,用于表示不仅仅是 SQL,它涵盖了四个主要类别 - 键值、文档、列族和图形数据库

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

例如 Redis、Riak 等。

文档数据库 具有存储各种属性以及大量数据的能力。

例如 MongoDB、CouchDB 等。

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

例如 Cassandra、HBase 等。

图形 数据库是一种使用图形结构进行语义查询的数据库,其中节点、边缘和属性用于表示和存储数据。

例如 Neo4j、InfiniteGraph 等。

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

一致性 - 系统中的所有服务器将具有相同的数据。

可用性 - 系统将始终响应请求(数据可能过时或过期。但最终将进行更正)。

分区容错性 - 即使单个服务器失败或无法访问,系统仍将作为一个整体运行。

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

从您的问题中可以得知:

CouchDBAP(可用性和分区)& 文档数据库

CassandraAP(可用性和分区)& 列族数据库

MongoDBCP(一致性和分区)& 文档数据库

VerticaCA(一致性和可用性)& 列族数据库

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


1
这并没有真正回答问题,只是解释了什么是NoSQL。 - freedev

8

一些NoSQL数据库是列式数据库,而有些SQL数据库也是列式的。无论数据库是行还是列导向,都属于数据库的物理存储实现细节,可以适用于关系型和非关系型(NoSQL)数据库。

例如,Vertica是一个列式关系数据库,因此它实际上不符合NoSQL数据存储的标准。

“NoSQL运动”数据存储最好定义为非关系型、共享无内容、水平可扩展的数据库,不一定具有ACID保证。一些列式数据库可以被描述为这种类型。除了列存储外,NoSQL实现还包括文档存储、对象存储、元组存储和图形存储。


6
一个NoSQL数据库是传统基于模式的数据库的不同范例。它们被设计成可扩展且可维持像 JSON 数据这样的文档。当然,他们有一种查询信息的方式,但您应该期望使用像 eval("person = * and age > 10) 这样的语法来检索数据。即使它们支持标准 SQL 接口,它们也旨在用于其他用途,因此如果您喜欢 SQL,则应坚持使用传统数据库。
列导向型数据库与传统行导向型数据库不同,因为它们存储数据的方式不同。通过将整个列放在一起而不是一行,当从包含许多列的行中选择几列时,可以最大限度地减少磁盘访问。在行导向型数据库中,如果您只选择一行或所有字段,没有区别。
但是,插入需要花费更多。插入新行将导致许多磁盘操作,具体取决于列数。
但是,在 SQL、ACID、外键等方面与传统数据库没有区别。

3
我建议阅读NoSQL维基百科条目的分类法部分,以了解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 ..." }
  ]
}

请注意,“comments”是一个具有独立结构的嵌套文档列表。查询可以从外部文档“进入”这些文档,例如查找由Jane评论的帖子或在某个日期范围内有评论的帖子。
简而言之,NoSQL数据库的两个主要区别是缺乏(正式的)模式和内容超出传统行/列数据库的二维定位。

3

0

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

3. 接口。 A组的特点是属于NoSQL运动,通常没有传统的SQL接口。B组支持标准的SQL接口。


0
这是我对它的看法:列式数据库处理数据在磁盘上的物理存储方式。顾名思义,每个列都单独存储在自己的空间/文件中。这有两个重要的作用:
  1. 你可以获得更好的压缩比,达到10:1的顺序,因为你只需要处理单个数据类型。
  2. 你可以获得更好的数据读取性能,因为你避免了整行扫描,只需选择你在SELECT查询中指定的列即可。
另一方面,NoSQL是一种全新的数据库类型,定义了“逻辑”聚合级别来解释数据。有些将数据视为具有层次关系(聚合体是“节点”),而其他将数据视为文档(这是聚合级别)。它们不指定物理存储策略(有些可能会这样做,但从最终用户的角度来看,这是抽象的)。
此外,整个NoSQL运动更多地与非结构化数据有关,或者说数据集其模式无法预先定义或未知,因此无法符合严格的关系模型。
列式数据库仍然处理关系数据,尽管消除了索引等需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接