Jason Pan

NoSQL 是什么?

潘忠显 / 2025-12-01


NoSQL 数据库(意即“不仅仅是 SQL”)存储数据的方式与关系表不同,其类型因数据模型而异。主要类型包括文档、键值、宽列和图形。它们提供了灵活的模式,可以随大量数据和高用户负载而轻松扩展。

在本文中,您将了解什么是 NoSQL 数据库,以及使用它的场景。

什么是 NoSQL 数据库?

人们使用“NoSQL 数据库”一词时,通常会使用它来指代任何非关系型数据库。有人说“NoSQL”代表“非 SQL”,而另一些人则说“不仅仅是 SQL”。无论哪种方式,大多数人都认为 NoSQL 数据库以更自然、更灵活的方式存储数据。NoSQL 是一种数据库管理方法,而 SQL 只是一种查询语言,与 NoSQL 数据库的查询语言类似。

数据库类型 - NoSQL

随着时间的推移,出现了四种主要的 NoSQL 数据库类型:文档数据库、键值数据库、宽列存储数据库和图形数据库。

如今,多模型数据库也变得相当流行。

面向文档的数据库

面向文档的数据库将数据存储在文档中,类似于 JSON (JavaScript Object Notation) 对象。每个文档包含成对的字段和值。值通常有多种类型,包括字符串、数字、布尔值、数组甚至其他对象。文档数据库提供了一种灵活的数据模型,非常适合半结构化和典型的非结构化数据集。它们还支持嵌套结构,便于表示复杂的关系或层级化数据。

文档数据库的例子有 MongoDB 和 Couchbase。典型的文档如下:

{
  "_id": "12345",
  "name": "foo bar",
  "email": "foo@bar.com",
  "address": {
    "street": "123 foo street",
    "city": "some city",
    "state": "some state",
    "zip": "123456"
  },
  "hobbies": ["music", "guitar", "reading"]
}

键值数据库

键值存储是一种较简单的数据库,其中每个项目都包含键和值。每个键都是唯一的,并与单个值相关联。它们用于缓存和会话管理,读写性能很高,因为它们倾向于将内容存储在内存中。例如 Amazon DynamoDB 和 Redis。键值数据库中存储的数据的简单视图如下:

Key: user:12345
Value: {"name": "foo bar", "email": "foo@bar.com", "designation": "software developer"}

宽列存储

宽列存储将数据存储在表格、行和动态列中。数据存储在表格中。不过,与传统的 SQL 数据库不同,宽列存储非常灵活,不同的行可以有不同的列集。这些数据库可采用列压缩技术来减少存储空间并提高性能。宽行宽列可高效检索稀疏和宽泛的数据。宽列存储的例子有 Apache Cassandra 和 HBase。宽列中存储数据的一个典型示例如下:

name id email dob city
Foo bar 12345 foo@bar.com Some city
Carn Yale 34521 bar@foo.com 12-05-1972

图形数据库

图形数据库以节点和边缘的形式存储数据。节点通常会存储有关人物、地点和事物(如名词)的信息,而边缘则会存储有关各节点间关系的信息。它们对于高度关联的数据非常有效,因为这些数据的关系或模式最初可能并不十分明显。图数据库的例子有 Neo4J 和 Amazon Neptune。MongoDB 还提供图遍历功能,使用聚合管道的 $graphLookup 阶段。下面举例说明如何存储数据:

nosql-explained

多模型数据库

多模型数据库支持多种类型的 NoSQL 数据模型,开发者可根据应用程序需求进行选择。这些数据库具有统一的数据库引擎,可以处理一个数据库实例中的多个数据模型。示例包括 CosmosDB 和 ArangoDB。

数据库类型快速比较 - NoSQL

每种 NoSQL 数据库都提供不同的功能。例如,图表数据库可能更适合分析实体之间的复杂关系和模式,而文档数据库以一种更灵活、更自然的方式来存储和检索文档之类的大量数据。数据库的选择取决于您想要开发的使用案例。

nosql-explained-comparison.png

NoSQL 数据库简史

随着存储成本的急剧下降,2000 年代末出现了 NoSQL 数据库。为了避免数据重复而创建难以管理的复杂数据模型的日子已经一去不复返了。为提高开发人员的工作效率,NoSQL 数据库获得了优化。

nosql-explained-storage-price

随着存储成本的迅速降低,应用程序需要存储和查询的数据量也随之增加。这些数据形形色色 - 结构化、半结构化和非结构化 - 提前定义模式几乎是不可能的。NoSQL 数据库允许开发者存储大量非结构化数据,从而为他们提供了很高的灵活性。

nosql-explained-history

2000 年代初期,Google 发表了一篇关于 BigTable(宽列数据库)的论文,探讨了分布式存储系统的广泛可能性。2009 年,NoSQL 数据库大幅增长,两个关键的面向文档数据库 MongoDB 和 CouchDB 应运而生。

到 2010 年代,出现了不同类型的 NoSQL 数据库,NoSQL 的接受度越来越高,企业变得更加以数据为导向。

此外,敏捷宣言 (Agile Manifesto) 越来越受欢迎,软件工程师正在重新考虑他们开发软件的方式。他们必须快速适应不断变化的需求,快速迭代,并在整个软件堆栈中(一直到数据库)进行更改。NoSQL 数据库为他们提供了这种灵活性。

云计算也越来越流行,开发者开始使用公有云来托管其应用程序和数据。他们希望能够在多个服务器和区域之间分布数据,以使其应用程序具有弹性,可以横向扩展而不是纵向扩展以及对数据进行智能地理定位。由于数字化的指数级增长,企业现在收集尽可能多的非结构化数据。为了能够从这样的 大数据 中分析和得出可行的 实时见解,企业需要超越简单存储的现代解决方案。企业需要一个可以轻松扩展、转换 和可视化数据 的平台;创建仪表盘、报告和图表;以及使用 AI 和商业智能工具 以提高企业生产力。由于其灵活和分布式特性,NoSQL 数据库(例如 MongoDB)在这些任务中大放异彩。

NoSQL 数据库功能

NoSQL 数据库是灵活、可扩展的分布式数据库。不同类型的 NoSQL 数据库有其独特的功能。

从高层次来看,NoSQL 数据库通常具有以下功能:分布式计算、扩展、灵活的模式和丰富的查询语言、便于开发者使用、分区容错性、高可用性

nosql-explained-features

BASE 合规

NoSQL 数据库符合 BASE 标准,即 b(基本)a(可用性)s(软状态)e(最终一致性)。基本可用性是指系统容忍部分故障(如节点丢失)的能力。软状态是指系统允许暂时的不一致性,最终随着时间的推移自动实现一致性。BASE 合规可确保高可用性、更快的数据处理速度、可扩展性和灵活性。但是, MongoDB 也可以配置为提供多文档 ACID 合规。

关系数据库与 NoSQL数据库示例

假设我们要存储有关用户及其爱好的信息。我们需要存储用户的名、姓、手机号码、城市和爱好。

在关系数据库管理系统 (RDBMS) 中,我们可能会创建两个表:一个用于“用户”,另一个用于“爱好”。

为了检索用户及其爱好的所有信息,需要将“用户”表和“爱好”表中的信息连接在一起。

我们为 NoSQL 数据库设计的数据模型将取决于我们选择的 NoSQL 数据库类型。我们考虑如何将有关用户及其爱好的相同信息存储在文档数据库(如 MongoDB)中。

为了检索有关用户及其爱好的所有信息,可以从数据库中检索单个文档。这样不需要连接,从而实现更快的查询。

rdbms-and-nosql

要查看此数据建模示例的更详细版本,请阅读将术语和概念从 SQL 映射到 MongoDB。

RDBMS 和 NoSQL 数据库的区别

关系数据库管理系统和非关系数据库之间存在多种差异。下面的表格总结了主要区别:

功能 NoSQL(非关系型) RDBMS(关系型)
数据建模 文档、键值、图、宽列表等,适合灵活数据结构 表格行列结构,适合高度结构化的数据
模式 模式灵活,可轻松变更 固定模式,变更成本较高
查询语言 各数据库自有查询语言 统一使用 SQL
可扩展性 原生支持水平扩展 以垂直扩展为主,水平扩展能力有限
数据关系 通过嵌套或引用建模关系 通过外键和 JOIN 建模关系
事务类型 支持 ACID 或 BASE,因产品而异 标准 ACID 事务
性能 擅长大数据、实时、分布式场景 擅长强一致、事务性场景
数据一致性 常见最终一致或可配置一致性 通常提供强一致性
分布式与容错 为分布式设计,支持分片、复制和高可用 可通过集群、复制实现,但灵活性较弱
数据分区与映射 分片灵活,常配合 ODM 等对象映射框架使用 支持表分区,常配合 ORM 做对象映射

NoSQL 使用场景

NoSQL 数据库系统几乎用于每个行业,适用于实时分析、内容管理、IoT 应用程序、推荐系统、欺诈检测、产品目录管理等等。

使用案例既有高度关键的(如存储财务数据和医疗记录),也有轻松有趣的(如存储智能猫砂盆的 IoT 读数)。

在决定使用哪个数据库时,决策者通常会发现以下一个或多个因素引导他们选择 NoSQL 数据库:

有关上述原因的更多详细信息,请参阅何时使用 NoSQL 数据库和探索 NoSQL 数据库示例。

NoSQL 数据库误解

多年来,关于 NoSQL 数据库的许多误解已经传遍整个开发者社区。在本节中,我们将讨论两个最常见的误解。

误解1:关系型数据最适合关系数据库

一个常见的误解是 NoSQL 数据库或非关系型数据库不能很好地存储关系型数据。NoSQL 数据库可以存储关系型数据 - 它们与关系型数据库的存储方式不同。

事实上,与关系数据库相比,许多人发现在 NoSQL 数据库中对关系型数据建模比在关系数据库中更容易,因为不必在表之间拆分相关数据。NoSQL 数据模型允许将相关数据嵌套在单个数据结构中。

误解2:NoSQL 数据库不支持 ACID 事务

另一个常见的误解是 NoSQL 数据库不支持 ACID 事务。一些 NoSQL 数据库,如 MongoDB,实际上支持 ACID 事务

请注意,在 NoSQL 数据库中对数据进行建模的方式,可以消除许多使用案例中对多记录事务的需求。考虑前面的示例,我们在关系模型和文档存储中存储了有关用户及其爱好的信息。为了确保有关用户及其爱好的信息在关系数据库中一起更新,我们需要使用事务来更新两个表中的记录。要在文档存储中执行相同的操作,我们可以更新单个文档 - 不需要多记录事务。

总结

NoSQL 数据库具有多种优势,包括灵活的数据模型、水平扩展、快如闪电的查询以及易于开发者使用。NoSQL 数据库有多种类型,包括文档存储、键值数据库、宽列存储、图表数据库和多模型数据库。