我对 NoSQL 的了解越多,我就越觉得它更像是一个面向列的数据库。
NoSQL(例如 CouchDB、Cassandra、MongoDB)和面向列的数据库(例如 Vertica、MonetDB)之间有什么区别?
我对 NoSQL 的了解越多,我就越觉得它更像是一个面向列的数据库。
NoSQL(例如 CouchDB、Cassandra、MongoDB)和面向列的数据库(例如 Vertica、MonetDB)之间有什么区别?
NoSQL是Not Only SQL的术语,它涵盖了四大类——键值、文档、列族和图形数据库。
键值 数据库非常适合具有频繁小读写以及简单数据模型的应用程序。这些记录使用唯一标识记录的键进行存储和检索,用于快速查找数据库中的数据。
例如 Redis、Riak 等。
文档数据库 能够存储各种属性以及大量数据
例如 MongoDB 、 CouchDB 等。
列族数据库专为海量数据、读写性能和高可用性而设计
例如 Cassandra、HBase 等。
图数据库是使用图结构进行语义查询的数据库,具有节点、边和属性来表示和存储数据
例如 Neo4j、InfiniteGraph 等。
在了解 NoSQL 之前,您必须了解一些关键概念。
一致性——系统中的所有服务器都将拥有相同的数据,因此使用该系统的任何人都将获得相同的副本,无论哪个服务器响应他们的请求。
可用性– 系统将始终响应请求(即使它不是最新数据或在整个系统中都不是一致的,或者只是一条表明系统无法正常工作的消息)。
分区容限——即使个别服务器出现故障或无法访问,系统仍可作为一个整体运行。
大多数时候,NoSQL 数据库只能满足上述三个属性中的两个。
从你的问题来看,
CouchDB :AP(可用性和分区)和文档数据库
Cassandra:AP(可用性和分区)和列族数据库
MongoDB :CP(一致性和分区)和文档数据库
Vertica :CA(一致性和可用性)和列族数据库
MonetDB : ACID(原子一致性隔离耐久性) 和关系数据库
一些 NoSQL 数据库是面向列的数据库,而一些 SQL 数据库也是面向列的。数据库是面向列还是面向行是数据库的物理存储实现细节,关系和非关系 (NoSQL) 数据库都是如此。
例如,Vertica 是一个面向列的关系数据库,因此它实际上不符合 NoSQL 数据存储的条件。
“NoSQL 移动”数据存储更好地定义为非关系、无共享、水平可扩展的数据库,没有(必然)ACID 保证。一些面向列的数据库可以通过这种方式进行表征。除了列存储,NoSQL 实现还包括文档存储、对象存储、元组存储和图形存储。
NoSQL 数据库是与传统的基于模式的数据库不同的范例。它们旨在扩展和保存像 json 数据这样的文档。显然他们有一种查询信息的方式,但是你应该期望像 eval("person = * and age > 10) 这样的语法来检索数据。即使它们支持标准的 SQL 接口,它们也适用于其他东西,所以如果你喜欢 SQL您应该坚持使用传统数据库。
面向列的数据库不同于传统的面向行的数据库,因为它们存储数据的方式。通过将整列而不是一行存储在一起,您可以在从包含许多列的行中选择几列时最小化磁盘访问。在面向行的数据库中,如果您从一行中仅选择一个或所有字段,则没有区别。
不过,您必须支付更昂贵的插入费用。插入新行将导致许多磁盘操作,具体取决于列数。
但是在 SQL、ACID、外键等方面与传统数据库没有区别。
我建议阅读 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 数据库的两个典型差异是缺少(正式的)模式和超出传统行/列数据库二维方向的内容。
区分列存储阅读此博客。这回答了你的问题。
这是我的看法: 面向列的数据库正在处理数据物理存储在磁盘上的方式。顾名思义,每一列都存储在自己单独的空间/文件中。这允许两件重要的事情:
另一方面,NoSQL 是一种全新的数据库,它定义了“逻辑”聚合级别来解释数据。一些将数据视为具有层次关系(聚合为“节点”),而另一些则将数据视为文档(这是聚合级别)。它们并不规定物理存储策略(有些可能会这样做,但从最终用户那里抽象出来)。
此外,整个 NoSQL 运动更多地与非结构化数据有关,或者更确切地说,数据集的模式无法预定义或事先未知,因此无法符合严格的关系模型。
面向列的数据库仍然处理关系数据,尽管不需要索引等。
正如@tuinstoel 所写,本文在第 3 点回答了您的问题:
3. 接口。 A 组的特点是作为 NoSQL 运动的一部分,通常没有传统的 SQL 接口。B 组支持标准 SQL 接口。