29

我对 NoSQL 的了解越多,我就越觉得它更像是一个面向列的数据库。

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

4

7 回答 7

22

NoSQL是Not Only SQL的术语,它涵盖了四大类——键值、文档、列族和图形数据库

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

例如 Redis、Riak 等。

文档数据库 能够存储各种属性以及大量数据

例如 MongoDB 、 CouchDB 等。

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

例如 Cassandra、HBase 等。

数据库是使用图结构进行语义查询的数据库,具有节点、边和属性来表示和存储数据

例如 Neo4j、InfiniteGraph 等。

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

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

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

分区容限——即使个别服务器出现故障或无法访问,系统仍可作为一个整体运行。

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

从你的问题来看,

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

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

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

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

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

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

在此处输入图像描述

看看这篇文章 1文章2和ppt的各种场景来选择特定类型的数据库。

于 2015-11-26T14:11:30.147 回答
8

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

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

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

于 2010-05-09T18:02:56.720 回答
6

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

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

不过,您必须支付更昂贵的插入费用。插入新行将导致许多磁盘操作,具体取决于列数。

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

于 2011-08-24T03:11:10.350 回答
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 ..." }
  ]
}

请注意“评论”是如何成为具有自己独立结构的嵌套文档的列表。查询可以从外部文档“进入”这些文档,例如查找具有 Jane 评论的帖子,或具有特定日期范围内的评论的帖子。

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

于 2012-06-29T20:55:20.920 回答
2

区分列存储阅读此博客。这回答了你的问题。

于 2014-01-14T16:36:33.693 回答
0

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

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

另一方面,NoSQL 是一种全新的数据库,它定义了“逻辑”聚合级别来解释数据。一些将数据视为具有层次关系(聚合为“节点”),而另一些则将数据视为文档(这是聚合级别)。它们并不规定物理存储策略(有些可能会这样做,但从最终用户那里抽象出来)。

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

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

于 2013-11-17T07:43:35.623 回答
0

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

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

于 2011-04-06T13:32:00.030 回答