开发应用程序时最基本的选择之一是使用SQL或NoSQL数据库存储数据。传统的SQL数据库(即关系数据库)是几十年技术进步、良好实践和现实世界压力测试的产物。它们是为可靠的事务和临时查询而设计的,这是业务应用程序的支柱。但它们也背负着一些限制-比如僵化的模式-使得它们不太适合其他类型的应用程序。
NoSQL数据库是针对这些限制而出现的。NoSQL系统存储和管理数据的方式允许开发人员以较高的操作速度和极大的灵活性。许多是由谷歌、亚马逊、雅虎和Facebook等公司开发的,它们寻求更好的方法来存储内容或为大型网站处理数据。与SQL数据库不同,许多NoSQL数据库可以在数百或数千台服务器上水平缩放。
[您应该使用哪个NoSQL数据库?让InfoWorld做你的向导。NoSQL怨恨匹配:MongoDB和Couchbase Server从头到头. • Nosql突出:最好的键值数据库. • NoSQL突出:最好的文档数据库.\x{e76f}跟上InfoWorld编程中最热门的主题应用程序开发报告通讯. ]
不过,NoSQL的优点并不是没有代价的。NoSQL系统通常不提供与SQL数据库相同的数据一致性级别。实际上,虽然SQL数据库传统上牺牲了性能和可伸缩性,但是酸性质在可靠事务的背后,NoSQL数据库在很大程度上放弃了对速度和可伸缩性的严格保证。
简而言之,SQL和NoSQL数据库提供了不同的权衡。虽然他们可以在特定项目的背景下进行竞争,例如,选择哪一个项目?这,这个申请或那,那个应用-它们在更大范围内是互补的。每个用例都适合不同的用例。这一决定与其说是一项决定,不如说是一个适合这项工作的工具的问题。
SQL和NoSQL之间的根本区别并没有那么复杂。对于如何存储和检索数据,每种方法都有不同的理念。
对于SQL数据库,所有数据都有一个固有的结构。常规数据库(如MicrosoftSQLServer、MySQL或Oracle数据库)使用图式-关于如何将数据插入数据库的正式定义。例如,表中的给定列可能仅限于整数。因此,列中记录的数据将具有高度正常化。SQL数据库的严格模式还可以相对容易地对数据执行聚合,例如通过联接。
使用NoSQL,数据可以无模式或自由格式的方式存储。任何数据都可以存储在任何记录中。在NoSQL数据库中,您将发现用于存储数据的四种通用模型,这将导致四种常见类型的NoSQL系统:
[ 学习Java从开始概念到高级设计模式在这个全面的12部分的课程! ]——【英文教程应该需要Money避坑】
模式-无模式数据存储在以下场景中非常有用:
传统数据库使用的结构化查询语言在存储和检索数据时提供了一种与服务器通信的统一方式。SQL语法是高度标准化的,因此单个数据库可能处理某些操作的方式不同(例如,窗口函数),基本情况保持不变。
相反,每个NoSQL数据库都有自己的查询和管理数据的语法。例如,CouchDB使用JSON形式的请求,通过HTTP发送到创造或检索文件从它的数据库。MongoDB通过命令行接口或语言库通过二进制协议发送JSON对象。
一些NoSQL产品能,会,可以使用类似SQL的语法处理数据,但只能在一定程度上使用.例如,ApacheCassandra,一个列存储数据库,有它自己的类似SQL的语言,Cassandra查询语言或CQL。有些CQL语法是直接脱离SQL剧本的,比如SELECT或INSERT关键字。但是无法在Cassandra中执行联接或子查询,因此CQL中不存在相关的关键字。
NoSQL系统常见的设计选择是“无共享”体系结构。在无共享的设计中,集群中的每个服务器节点独立于其他节点运行。系统不必从每个节点获得一致意见才能将一段数据返回给客户端。查询速度很快,因为可以从最接近或最方便的节点返回查询。
共享的另一个优点-没有什么是弹性和扩展-的优点。扩展集群就像在集群中旋转新节点并等待它们与其他节点同步一样容易。如果NoSQL节点出现故障,集群中的其他服务器将继续运行。所有数据仍然可用,即使可用的节点更少。
注意,没有共享的设计不是。排他性到NoSQL数据库。许多传统的SQL系统可以不以共享的方式设置,尽管这通常需要牺牲整个集群的一致性来提高性能。
如果NoSQL提供了如此多的自由和灵活性,为什么不完全放弃SQL呢?简单的答案是:许多应用程序仍然需要SQL数据库提供的各种约束、一致性和保护。在这些情况下,NoSQL的一些“优点”可能会变成缺点。其他限制来自于NoSQL系统相对较新的事实。
即使您接受的是自由格式的数据,您也几乎总是需要对其施加约束才能使其有用。对于NoSQL,施加约束涉及将责任从数据库转移到应用程序开发人员。例如,开发人员可以通过对象关系映射系统(ORM)强加结构。但是如果你想让模式活下来数据本身,NoSQL通常不会这样做。
一些NoSQL解决方案为数据提供了可选的数据类型和验证机制。例如,apache Cassandra本机数据类型这让人想起了在常规SQL中发现的那些。
为了获得更好的可用性和性能,NoSQL系统交换强大的或立即的一致性。常规数据库确保操作是原子(事务的所有部分都成功,否则没有成功),一致(所有用户都有相同的数据视图),孤立(交易不竞争),以及耐久(一旦完成,它们将在服务器故障中幸存下来)。
这四个属性统称为ACID,在大多数NoSQL系统中处理方式不同。而不是整个集群的直接一致性,而是最终一致性,因为要将更新复制到集群中的其他节点所需的时间。插入到集群中的数据最终在任何地方都是可用的,但是您不能保证什么时候。
事务语义,它在SQL系统中保证事务中的所有步骤(例如,执行销售)。和减少库存)已经完成或回滚,通常在NoSQL中是不可用的。对于任何需要“单一真相来源”(如银行)的系统,NoSQL方法都不能很好地工作。你不希望你的银行余额因你去哪台自动取款机而不同;你希望它在任何地方都是一样的。
一些NoSQL数据库有部分机制来解决这个问题。例如,MongoDB为单个操作提供了一致性保证,但对于整个数据库却没有提供一致性保证。Microsoft Azure CosmosDB允许您选择每个请求的一致性级别,因此您可以选择适合您的用例的行为。但是对于NoSQL,期望最终的一致性作为默认行为。
大多数NoSQL系统是概念上相似,但落实完全不同。对于数据的查询和管理方式,每个人都有自己的隐喻和机制。
这的一个副作用是应用程序逻辑和数据库之间潜在的高度耦合。如果您选择一个NoSQL系统并坚持使用它,这并不是那么糟糕,但是如果您在路上更改系统,它可能会成为一个绊脚石。
如果您从MongoDB迁移到CouchDB(反之亦然),您必须做的不仅仅是迁移数据。您还必须了解数据访问和编程隐喻的不同之处-换句话说,您必须重写访问数据库的应用程序的各个部分。
NoSQL的另一个缺点是相对缺乏专业知识。在传统SQL人才市场仍然相当庞大的地方,NoSQL技能的市场才刚刚起步。
作为参考,Indeed.com报告说,截至2017年年底,常规SQL数据库的职务列表数量-MySQL、Microsoft SQL Server、Oracle数据库等-在过去三年中仍然高于MongoDB、Couchbase和Cassandra的工作数量。对NoSQL专业知识的需求正在增长,但它仍然是传统SQL市场的一小部分。
我们可以预期SQL和NoSQL系统之间的一些差异会随着时间的推移而消失。现在已有许多SQL数据库接受JSON文档作为本机数据类型,并且可以对该数据执行查询。有些甚至有对JSON数据施加约束的本机方式,以便与传统的行和列数据一样严格地处理JSON数据。
另一方面,NoSQL数据库不仅添加了类似SQL的查询语言,还添加了传统SQL数据库的其他功能。例如,至少有两个文档数据库-MarkLogic和RavenDB-承诺遵守ACID标准。
有迹象表明,未来几代数据库将跨越范例,并提供NoSQL和SQL功能。微软的Azure宇宙数据库例如,在引擎盖下使用一组原语来交替地再现这两种系统的行为。谷歌云扳手是一个SQL数据库,它将强大的一致性与NoSQL系统的水平可伸缩性结合起来。
不过,纯SQL和纯NoSQL系统将在未来许多年中占据一席之地。查看NoSQL以获得对自由格式数据的快速、高度可伸缩的访问。这需要付出一些代价,比如读取的一致性和SQL数据库常用的其他安全措施。但是对于许多应用程序来说,这些安全措施很可能值得用NoSQL提供的东西来交换。