NoSQL 是什么?

NoSQL 包含多种不同的数据库技术,这些技术旨在响应构建现代应用程序时遇到的要求。

  • 开发人员所处理的应用程序生成了大量瞬息万变的新型数据——包括结构化数据、半结构化数据、非结构化数据和多态数据。

  • 耗时长达十二至十八个月的瀑布式开发周期早已一去不返了。现在的小型团队将工作分为多个敏捷的冲刺阶段,进行快速迭代,每周或每两周推送代码,有的甚至每天推送几次。

  • 许多曾经仅服务于一个受众群体的应用程序,现在作为服务交付,并且必须始终在线、能从多种不同设备上访问、能扩展到覆盖全球数百万用户。

  • Organizations are now turning to scale-out architectures using open software technologies, commodity servers and cloud computing instead of large monolithic servers and storage infrastructure.

  • 关系型数据库在设计上无法应对现代应用程序在扩展性和敏捷度方面的挑战,在构造上也无法发挥利用商业存储的优势和当今强大的处理能力。

要在短短数分钟内启动 NoSQL 集群,就选择 MongoDB Atlas:托管数据库即服务

尝试以最简单的方法开始在领先的非关系型数据库 MongoDB 上学习和构建应用程序原型。

无论在哪种数据库上启动应用程序,通常都需要谨慎规划,以确保性能、高可用性、安全性和灾难恢复;而在运行应用程序的期间,也必须继续满足这些要求。利用 MongoDB Atlas,您可以获得 MongoDB 的所有功能,同时不需要承担运营方面的繁重工作。如此一来,您就可以专注于学习和构建您的应用程序。功能包含:

  • 按需使用、随用随付的模式

  • 无缝升级和自动修复

  • 充分的弹性。轻松向上向下扩展

  • 深度监控和自定义提醒

  • 默认高度安全

  • 持续备份,任意时间点恢复

NoSQL 数据库类型

  • 文档型数据库 将每个键与一个复杂的数据结构(即文档)配对。文档可以包含多对不同的键-值 (key-value)、键-组 (key-array),甚至多个嵌套文档 (nested document。

  • 图形存储数据库 用于存储关于数据网络的信息,例如社交连接。图形存储数据库包括 Neo4J 和 Giraph。

  • 键值存储数据库 是最简单的 NoSQL 数据库。这种数据库里的每一个项都作为属性名称(也叫“键”)和它的值一并存储。Riak 和 Berkeley DB 都是键值存储数据库。包括 Redis 在内的某些键值存储数据库允许每个值对应一个类型(例如对应“integer”),从而增加了功能性。

  • 列存储数据库 例如 Cassandra 和 HBase 专为涉及大数据集的查询而优化,并将数据汇总成列而不是成行存储。

NoSQL 的优点

与关系型数据库相比,NoSQL 数据库 具有更好的扩展性、能提供更出色的性能, 而且其数据模型能解决关系型模型本身无法解决的问题:

  • 数量庞大且变化迅速的结构化数据、半结构化数据和多态数据

  • 敏捷 sprint 周期、快速的模式迭代和频繁的代码推送

  • 易用且灵活的面向对象编程

  • 多地区分布式横向扩展架构,取代昂贵的单体架构

阅读我们的免费白皮书《评估 NoSQL 数据库时需要考虑的 5 大要素》,并了解:

  • 如何选择适当的数据库存储模型:文档存储、键值存储、列存储、图形存储

  • 一致性系统与最终一致性系统的利弊

  • 为什么原生驱动程序能最大程度缩短新开发人员的入门时间和简化应用程序开发

下载白皮书

动态模式

关系型数据库要求必须在添加数据之前先定义模式。例如,您可能想存储与您的客户有关的数据,如电话号码、姓名、地址、城市和州等:SQL 数据库需要提前知道您要存储的是什么数据。

这一点非常不符合 敏捷开发 方法的理念,因为每当您完成新的功能时,您的数据库模式往往都需要更改。因此,假如在开发过程中进行了几次迭代之后,您想存储客户收藏的商品以及客户的地址和电话号码,这时候您就需要把这一列添加到数据库里,然后将整个数据库迁移到新的模式。

假如这个数据库很庞大,这个过程就会相当缓慢,造成大量的停机时间。假如您频繁地更改您的应用程序所存储的数据(因为快速迭代的缘故),就可能相应地频繁造成停机时间。在使用关系型数据库的情况下,也没有办法有效地应对完全非结构化的数据或未提前知道的数据。

NoSQL 数据库被搭建成允许嵌入数据,而不要求有一个预定义的模式。如此一来,就很容易实时进行重大的应用程序更改,而不需要担心服务中断;这意味着开发速度更快、集成更可靠、数据库管理员需要花费的时间更少。开发人员通常不得不添加应用程序代码来执行数据质量控制,例如强制规定使用某些字段、数据类型或允许值。较复杂的 NoSQL 数据库允许在数据库内应用验证规则,令用户可以强制执行对数据的治理,同时又保留了动态模式的敏捷优点。

自动分片 由于其结构方式的缘故,关系型数据库通常纵向扩展:只用一台服务器来托管整个数据库,以确保多表连接和事务都达到尚可的性能。这种方法很快就会产生高昂的费用、限制扩展,并对数据库基础设施构成相对少量的故障点。支持快速发展的应用程序的解决方案是横向扩展,即增加服务器数量而不是将更多容量集中在单个服务器上。

使用 结构化查询语言 数据库可以实现将一个数据库“分片”,使其分布在多个服务器实例中,但通常的分片做法是通过 SAN 和其他复杂的安排让硬件充当单台服务器。由于数据库并不具备这种原生能力,开发团队就承担了在多台机器上部署多个关系型数据库的工作。数据被自动存储在各个数据库实例中。应用程序代码会开发出来,用于分布数据、分布查询、将所有数据库实例中的数据的结果聚合起来。还必须开发另外的代码来处理资源故障、执行跨数据库连接,满足数据重平衡、复制等要求。此外,在采用手动分片的情况下,关系型数据库的事务完整性等多项优点就会大打折扣或者荡然无存。

NoSQL 数据库则通常支持自动分片,这意味着这些数据库会原生且自动地将数据散布到任意数量的服务器上,同时甚至不要求应用程序感知服务器池的组成。数据和查询负载会在多台服务器上自动均衡。当一台服务器发生故障时,它可以迅速而透明地被替换掉,而不会造成应用程序中断。

云计算 使自动分片变得更加容易,因为 Amazon Web 服务 (AWS) 之类的提供商可以按需提供几乎无限的容量,并处理所有必要的基础设施管理任务。开发人员不再需要构建复杂、昂贵的平台来支持自己的应用程序,而是可以集中精力编写应用程序代码。商业服务器可以作为单台高端服务器,以低廉得多的价格提供同样的处理能力和存储能力。

复制

大多数 NoSQL 数据库还支持数据库自动复制,从而在发生断电或进行计划内维护时保持可用性。较复杂的 NoSQL 数据库具有完全自我修复能力,提供自动的故障转移和恢复,还能将数据库分布到多个地理区域,以抵御地区性的故障和实现数据本地化。与关系型数据库不同的是,NoSQL 数据库一般不要求另外借助应用程序或昂贵的附加组件来实施复制。

集成缓存

有很多产品为 结构化查询语言 数据库系统提供缓存层。这些系统可以显著提升读性能,但并不能提升写性能,而且会给系统部署增加操作难度。如果您的应用程序包含大量读操作,则可以考虑分布式缓存;但如果您的应用程序包含的写量不算多,那么分布式缓存可能无法为您的终端用户提升整体体验,反而会增加管理缓存验证的难度。

许多 NoSQL 数据库技术具备出色的集成缓存功能,尽可能将常用数据保留在系统内存中,免除了另外使用一个缓存层的必要。有些 NoSQL 还提供全托管的集成式内存数据库管理层,用于要求最高吞吐量和最低延时的工作负载。

结构化查询语言 数据库NoSQL 数据库
类型一种类型(SQL 数据库),有细微差别多种不同类型,包括键值存储数据库、 文档型数据库、列存储数据库和图形数据库
开发历史开发于二十世纪七十年代,应对第一次数据存储应用程序浪潮开发于二十一世纪末,应对 结构化查询语言 数据库所存在的局限,尤其是可扩展性、多结构化数据、地理分布和敏捷开发 sprint 周期这些方面的局限
例子MySQL, Postgres, Microsoft 结构化查询语言 Server, Oracle DatabaseMongoDB, Cassandra, HBase, Neo4j
数据存储模型个别记录(如“员工”)作为表格中的行存储,每列存储一个关于该记录的具体数据(如“经理”、“聘用日期”等),与电子表格非常相似。相关数据存储在单独的表格中,然后在执行较复杂的查询时结合起来。例如,必须将“办公室”存储在一个表格中,将“员工”存储在另一个表格中。当用户想查找某员工的工作地址时,数据库引擎会将“员工”表格和“办公室”表格结合起来,获取所有必要的信息。根据数据库类型而异。例如,键值存储数据库的作用方式与 结构化查询语言 数据库相似,但只有两列(即“键”和“值”),而比较复杂的信息有时作为 BLOB(二进制大对象)存储在“值”列里。文档型数据库完全剔除了表格行模型,将所有相关数据一并存储在 JSON 格式或 XML 格式的单个“文档”中,或者存储为可按照层级结构嵌套值的另一种格式。
模式结构和数据类型是提前固定的。如果要存储关于某个新数据项的信息,就必须修改整个数据库,而修改时必须让数据库处于离线状态。通常为动态模式,有些需要强制执行数据验证规则。应用程序可以动态添加新字段,并且与 结构化查询语言 表格行不同的是,不相似的数据可在必要时一并存储。对于某些数据库(例如列存储数据库),动态添加新字段比较困难。
扩展纵向扩展,意味着必须提高单台服务器的功能性,以便应对更高的需求。将 结构化查询语言 数据库分布在多台服务器上是可以做到的,但一般需要大量额外的工程工作,而关系型的某些核心功能(如 JOIN、参照完整性、事务等)通常会丧失。横向扩展,意味着数据库管理员只需通过增加商业服务器或云实例即可增加容量。必要时,数据库自动将数据散布到多台服务器上。
开发模型Mix of open technologies (e.g., Postgres, MySQL) and closed source (e.g., Oracle Database)Open technologies
支持多记录 ACID 事务大多数NoSQL数据库不支持。MongoDB 4.0 及更高版本支持多文档 ACID 事务。 了解详情
数据操纵特定语言使用 Select、Insert 和 Update 语句,例如 SELECT fields FROM table WHERE&通过面向对象的应用程序编程接口
一致性可以配置强一致性取决于产品。有些提供强一致性(如 MongoDB,读一致性可微调),有些则提供最终一致性(如 Cassandra)。

实施 NoSQL 数据库

Often, organizations will begin with a small-scale trial of a NoSQL database in their organization, which makes it possible to develop an understanding of the technology in a low-stakes way. Most NoSQL databases are also based on open technologies and are free to use, meaning that they can be downloaded, implemented and scaled at little cost. Because development cycles are faster, organizations can also innovate more quickly and deliver superior customer experience at a lower cost.

在考虑用其他方案替代遗留基础设施时,您的动力可能来自几方面:在您的现有系统功能的基础上扩展或提升性能,识别可替代昂贵的专有软件的可行方案,或者提高开发的速度或敏捷度。在为您的业务和应用程序选择适当的数据库时,需要从五个重要方面来考虑。

免费白皮书

阅读我们的免费白皮书:评估 NoSQL 数据库时需要考虑的 5 大要素 并了解:

如何选择适当的数据库存储模型:文档存储、键值存储、列存储、图形存储

一致性系统与最终一致性系统的利弊

为什么原生驱动程序能最大程度缩短新开发人员的入门时间和简化应用程序开发

下载白皮书(仅提供英文版本)