一文读懂NoSQL数据库

摘要:SQL数据库对数据类型和一致性有要求,NoSQL为了速度、灵活性和规模而放弃了这些要求。

在开发应用程序时,最基本的选择之一就是是否使用SQL或NoSQL数据库来存储数据。传统的SQL(即关系)数据库是几十年技术演进、良好实践和实际压力测试的产物。它们是为可靠的事务和特殊查询而设计的,是业务应用程序主要采用的方式。但他们也承受了一些限制,比如死板的计划,使他们不适合其他种类的应用。

NoSQL数据库是为了突破这些限制而产生的,NoSQL系统存储和管理数据的方式,使开发人员具有较高的操作速度和极大的灵活性。像谷歌、亚马逊、雅虎和Facebook这些公司的开发者,他们寻求更好的方法来存储内容或处理大型网站的数据。与SQL数据库不同,许多NoSQL数据库可以在数百或数千台服务器的水平上进行伸缩。

NoSQL vs. SQL

SQL和NoSQL之间的根本区别并不是那么复杂,对于如何存储和检索数据,都有不同的哲学。

对于SQL数据库,所有数据都有一个固有的结构。像Microsoft SQL Server、MySQL或Oracle数据库这样的传统数据库使用了schema,即明确的定义,如何将数据插入到数据库中。例如,表中给定的列只能限于整数,因此,此栏所记录的数据将具有高度的标准化。一个SQL数据库的刚性模式也使得对数据进行聚合变得相对容易,例如通过连接方式。

使用NoSQL,数据可以以无模式或自由格式存储,任何数据都可以存储在任何记录中。在NoSQL数据库中,你将找到四个用于存储数据的常用模型,这将导致4种常见的NoSQL系统:

文档数据库(如CouchDB,MongoDB),插入的数据以自由格式的JSON结构或“文档”形式存储,其中数据可以是任何从整数到字符串到自由格式文本的内容。没有必要指定文档将包含哪些字段。

键值存储(例如Redis,Riak),从简单的整数或字符串到复杂的JSON文档,在数据库中以键的方式访问自由格式的值。

列存储(如HBase,Cassandra),数据存储在列中,而不是传统的SQL系统中的行。可以根据需要对任意数量的列(以及不同类型的数据)进行分组或聚合,以进行查询或数据视图。

图数据库(例如Neo4j),数据以网络或实体的图形和它们的关系表示,图中的每个节点都是一个自由的数据块。

无模式数据存储在以下场景中是有用的:

希望快速访问数据,更关心访问速度和简单性,而不是可靠的事务或一致性。

正在存储大量的数据,并且不想将自己锁在一个模式中,因为稍后更改模式可能会比较缓慢和痛苦。

正在接收来自一个或多个源的非结构化数据,希望将数据保存在原始表单中,以获得最大的灵活性。

希望将数据存储在分层结构中,但希望这些层次结构由数据本身描述,而不是外部模式。NoSQL允许数据以随意的方式进行自我引用,这对于SQL数据库来说更加复杂。

查询NoSQL数据库

传统数据库使用的结构化查询语言提供了在存储和检索数据时与服务器通信的统一方法。SQL语法是高度标准化的,因此,虽然单个数据库可以以不同的方式处理某些操作(例如,window functions),但基础仍然是相同的。

相比之下,每个NoSQL数据库都有自己的查询和管理数据的语法。例如,CouchDB使用JSON形式的请求,通过HTTP发送,从其数据库创建或检索文档。MongoDB通过命令行接口或语言库向二进制协议发送JSON对象。

一些NoSQL产品可以使用类似sql的语法来处理数据,但仅限于有限的范围。例如,Apache Cassandra,一个列存储数据库,有它自己的类似sql的语言,Cassandra查询语言或CQL。一些CQL语法直接来自于SQL脚本,比如SELECT或INSERT关键字。但是无法在Cassandra中执行联接或子查询,因此CQL中不存在相关的关键字。

无共享架构

NoSQL系统常见的设计选择是“无共享”架构,在无共享的设计中,集群中的每个服务器节点都独立于其他节点运行。系统不必从每一个节点获得一致性,将一个数据返回给客户端。查询速度快,因为它们可以从最接近或最方便的节点返回。

无共享架构的另一个好处是,弹性和扩展。扩展集群就像在集群中添加新节点并等待它们与其他节点同步一样容易。如果NoSQL节点宕机,集群中的其他服务器将继续运行,所有的数据仍然可用,即使提供服务请求的节点更少。

注意,无共享架构并不专属于NoSQL数据库,许多传统的SQL系统也可以以一种没有共享的方式设置,尽管这通常需要牺牲集群的一致性以获得性能。

NoSQL的局限性

如果NoSQL提供了如此多的自由和灵活性,为什么不完全抛弃SQL呢?答案很简单:许多应用程序仍然需要SQL数据库提供的约束、一致性和安全保障。在这些情况下,NoSQL的一些“优势”可能会变成劣势,其他限制源自NoSQL系统相对较新的事实。

无模式

即使使用的是自由格式的数据,几乎总是需要对其施加约束以使其有用。对于NoSQL,强制约束包括将责任从数据库转移到应用程序开发人员。例如,开发人员可以通过对象关系映射系统(ORM)来实施结构。但是,如果你希望模式与数据本身共存,NoSQL通常不会这样做。

一些NoSQL解决方案为数据提供可选的数据类型和验证机制。例如,Apache Cassandra拥有大量的本地数据类型,这让人想起了在常规SQL中发现的那些数据类型。

最终一致性

NoSQL系统对更好的可用性和性能进行了强烈或即时的一致性。传统的数据库确保了操作是原子的(事务的所有部分都成功了,或者没有成功),一致的(所有用户都有相同的数据视图),孤立的(事务不竞争),并且持久(一旦完成,它们将在服务器故障中幸存)。

这四个属性,统称为ACID,在大多数NoSQL系统中处理方式不同。由于需要将更新复制到集群中的其他节点,因此在整个集群中没有立即的一致性,但有最终的一致性。插入到集群中的数据最终在任何地方都可以使用,但不能保证何时。

在SQL系统中,事务语义保证事务中的所有步骤(例如执行销售和减少库存)要么完成了,要么回滚,这通常在NoSQL中是没有的。对于任何需要“真实的单一来源”的系统,例如银行,NoSQL方法都不能很好地工作。你不希望你的银行余额与ATM机上的不同,你希望它在任何地方都一致。

一些NoSQL数据库有部分机制来解决这个问题。例如,MongoDB对单个操作有一致性保证,但对整个数据库没有一致性保证。微软Azure CosmosDB允许选择每个请求的一致性级别,因此可以选择适合的用例的行为。但对于NoSQL,最终一致性是默认行为。

NoSQL锁定

大多数NoSQL系统在概念上是相似的,但是它们的实现非常不同。每个都有自己的规则和机制,以了解数据如何被查询和管理。

其中的一个副作用是应用程序逻辑和数据库之间可能存在高度耦合。如果你选择了一个NoSQL系统并坚持使用它,这并没有那么糟糕,但如果你在半路上改变系统,它就会成为绊脚石。

如果你从MongoDB迁移到CouchDB(反之亦然),那么你必须做的不仅仅是迁移数据。你还必须了解数据访问和编程语法的差异,换句话说,你必须重写访问数据库的那部分应用程序。

NoSQL技能

NoSQL的另一个缺点是缺乏专业人士,传统的SQL人才市场上仍然相当多,NoSQL技能的人才市场还处于萌芽阶段。

据Indeed.com网站报道,截至2017年

底,传统的SQL数据库,mysql、微软SQL Server、Oracle数据库等,职位数量在过去三年里比MongoDB、Couchbase和Cassandra的工作数量还要高。对NoSQL专业技术的需求正在增长,但它仍然是传统SQL市场的一小部分。

合并SQL和NoSQL

我们可以预期SQL和NoSQL系统之间的一些差异会随着时间的推移而消失。现在已有许多SQL数据库接受JSON文档作为本地数据类型,并可以对该数据执行查询。有些甚至有本地方法来对JSON数据施加约束,这样就可以处理与常规行和列数据相同的严格性。

另一方面,NoSQL数据库不仅增加了类似SQL的查询语言,还增加了传统SQL数据库的其他功能。例如,至少有两个文档数据库,MarkLogic和RavenDB,承诺是ACID兼容的。

有迹象表明,未来几代数据库将跨出范例并提供NoSQL和SQL功能。例如,微软的Azure Cosmos DB,数据库引擎可以交替地复制这两种系统的行为。谷歌云Spanner是一个与NoSQL系统的水平可扩展性相结合的SQL数据库。

不过,纯SQL和纯NoSQL系统将在未来的许多年都有一席之地,以实现快速、高度可伸缩的自由格式数据访问。这带来了一些成本,比如对SQL数据库常见的读取和其他保护措施。但对于许多应用程序来说,使用NoSQL,这些安全措施很可能值得牺牲。

https://www.infoworld.com/article/3240644/nosql/what-is-nosql-nosql-databases-explained.html

本文来自企鹅号 - 云技术实践媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

从APM角度上看:NoSQL和关系数据库并无不同

Michael Kopp拥有十年以上C++、Java/JEE的架构及开发经验,现Compuware技术策略师,专攻大规模产品部署的架构和性能。 以下为译文: 传...

2178
来自专栏数据和云

没有宫廷内斗,数据库界的延禧攻略

作者 | 张甦, 数据库领域的专家和知名人士、图书《MySQL王者晋级之路》作者,51CTO 专家博主。近10年互联网线上处理及培训经验,专注于 MySQL 数...

1032
来自专栏架构师之路

缓存架构设计细节二三事

本文主要讨论这么几个问题: (1)“缓存与数据库”需求缘起 (2)“淘汰缓存”还是“更新缓存” (3)缓存和数据库的操作时序 (4)缓存和数据库架构简析 一、...

3689
来自专栏大宽宽的碎碎念

你对Redis的使用靠谱吗?Redis的性能高,吗?Redis可以保证原子性,吗?用Redis可以实现事务,吗?用Redis可以当队列,吗?Redis适合用来做什么?

45610
来自专栏更流畅、简洁的软件开发方式

利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率 续

续 上一篇引起了大家的讨论,看着讨论我是比较晕的,这也怪我没有说清楚,所以再补一个续把问题说清楚吧。 笔记本配置 CPU:Core 2 7250 2.0G ...

2049
来自专栏性能与架构

又拍网数据库架构案例分析

这篇文章是对又拍网公布的数据库案例的分析总结 又拍网是一个大型照片分享社区,数据库架构也是从简单到复杂发展起来的 数据库进化过程 (1)一主一从 最初...

2896
来自专栏web前端教室

闲聊javascript设计模式 - 单例模式

闲聊javascript设计模式 - 单例模式 最近在写电商网站的过程中,遇到了许多问题,也有很多遗憾的地方, 这几天一直在回忆开发的过程,现在想来有许多地方应...

1967
来自专栏CDA数据分析师

案例分析:基于消息的分布式架构

美国计算机科学家,LaTex的作者Leslie Lamport说:“分布式系统就是这样一个系统,系统中一个你甚至都不知道的计算机出了故障,却可能导致你自己的计算...

2428
来自专栏沃趣科技

沃趣科技火线救援某公安系统核心业务数据

求助电话 只剩下键盘敲打声的办公室,被一个突如其来的电话打破了宁静。电话那头,是某公安客户的紧急求助。 案发现场 其核心数据库,由于存储突然断电,导致数据库实例...

3437
来自专栏IT技术精选文摘

Go语言构建千万级在线的高并发消息推送系统实践

2522

扫码关注云+社区