一文读懂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 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

重新认识同步与异步,阻塞和非阻塞的概念

在实际的开发中,我们经常会听到同步,异步,阻塞,非阻塞这些编程概念,每次遇到的时候都会蒙圈,然后就各种查网上似是而非的资料,结果越查越迷糊,大部分文章都千篇一律...

812
来自专栏后端技术探索

深入 Nginx:我们是如何为性能和规模做设计的

NGINX 在网络应用中表现超群,在于其独特的设计。许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应...

430
来自专栏JetpropelledSnake

Python Web学习笔记之CPU时间片

时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时 间片结束时进程...

39911
来自专栏大数据技术学习

Storm与Spark、Hadoop三种框架对比

Storm与Spark、Hadoop这三种框架,各有各的优点,每个框架都有自己的最佳应用场景。所以,在不同的应用场景下,应该选择不同的框架。

692
来自专栏美团技术团队

微服务拆分过细?“卫星”系统帮你做日志收集无遗漏

背景 随着酒店业务的高速发展,我们为用户、商家提供的服务越来越精细,系统服务化程度、复杂度也逐渐上升。微服务化虽然能够很好地解决问题,但也有副作用,比如,问题定...

3807
来自专栏MongoDB中文社区

MongoDB 4.0 RC 版本强势登陆

MongoDB 因其灵活的文档模型、可扩展分布式设计广受开发者喜爱,在此基础上,MongoDB 4.0 推出了更强大的功能支持,目前4.0第一个RC版本已经发布...

972
来自专栏互联网技术栈

Zookeeper 使用场景

611
来自专栏Java帮帮-微信公众号-技术文章全总结

【大牛经验】搜狗商业平台Java技术实践

搜狗商业平台Java技术实践 Java自1995年问世以来,已历经20多年岁月。20年来,IT技术风起云涌,Java始终以其可移植性、跨平台性、生态系统完备性等...

36110
来自专栏IT米粉

Redis常见的应用场景解析

Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用,这里介绍下Redis经常遇到的使用...

3306
来自专栏鸿的学习笔记

简单聊聊分布式系统的一致性问题

记得有人说过,分布式系统的所有问题归根结底都是一致性问题。前面文章提到的数据复制,分区以及事务面临的问题都是如何保证数据一致。而分布式系统不同于单机,它不...

621

扫码关注云+社区