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

相关文章

来自专栏崔庆才的专栏

Scrapyd 日志输出定时清理

现在维护着一个新浪微博爬虫,爬取量已经5亿+,使用了Scrapyd部署分布式。Scrapyd运行时会输出日志到本地,导致日志文件会越来越大,几十个G,这个其实就...

1.2K00
来自专栏iMySQL的专栏

基于 MySQL 5.7多源复制及 Keepalived 搭建三节点高可用架构

MySQL 5.7发布后,在复制方面有了很大的改进和提升。比如开始支持多源复制以及真正的支持多线程复制。本文讲述基于 MySQL 5.7多源复制及 Keepal...

42600
来自专栏云资讯小编的专栏

腾讯云采购节服务器三折起,这才是人民的云计算!

4月24日,腾讯云正式启动 “腾讯云采购节”大促活动,活动期间旗下云服务器、云数据库、域名等多款核心产品大幅降价,最低折扣达3折,优惠方式也涵盖了新用户礼包、大...

90300
来自专栏张秀云的专栏

Spider 引擎分布式数据库解决方案(最全的 spider 教程)

最近开始负责财付通的数据库的相关维护工作,其中有几套系统使用的 spider 引擎,本文将 spider 引擎的功能、使用场景、部署、实战测试等做个简单的总结。

1.4K10
来自专栏VMCloud

【腾讯云的1001种玩法】构建企业级应用环境之数据层面优化(一)

本系列为两年前 VMCloud 云平台的进阶篇,本次借助 QCloud 的《1001种玩法》活动来继续完成进阶篇,主要以在 QCloud 上搭建一个完整的应用环...

1.3K00
来自专栏iMySQL的专栏

分区表场景下的 SQL 优化

有个表做了分区,每天一个分区。该表上有个查询,经常只查询表中某一天数据,但每次都几乎要扫描整个分区的所有数据,有什么办法进行优化吗?

15100
来自专栏谭伟华)的专栏

Amazon Aurora:云时代的数据库 ( 上)

文章是 Amazon 在 SIGMOD\'17 上最新发表的关于 Aurora 论文的翻译版本,详尽的介绍了Aurora 设计背后的驱动和思考,以及如何在云上实...

93610
来自专栏苏强的专栏

腾讯云分布式数据库(DCDB)

DCDB 是部署在腾讯云公有云上的一种兼容MySQL协议和语法,支持自动水平拆分的share nothing架构的分布式数据库。分布式数据库即业务获取是完整的逻...

84900
来自专栏谭伟华)的专栏

Amazon Aurora:云时代的数据库 ( 中)

文章详尽的介绍了 Aurora 设计背后的驱动和思考,以及如何在云上实现一个同时满足高并发、高吞吐量、高稳定性、高可用、高扩展的云数据库。

57500
来自专栏EarlGrey的专栏

公有云的商业模式分析

最近看到一篇文章,里面以酒店为比喻,对公有云的商业模式进行了分析,还比较生动、形象。在社区里摘录如下。

1.5K00

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励