公告推出MongoDB 8.0,史上最快的MongoDB!了解更多 >>推出MongoDB 8.0,史上最快的MongoDB!>>

什么是文档数据库?

文档数据库(也称为文档型数据库或文档存储)是一种将信息存储在文档中的数据库。

Example of a JSON document

文档数据库提供了多种优势,包括

  • 直观的数据模型,快速且易于开发者使用
  • 灵活的模式,允许数据模型随着应用程序需求的变化而演变
  • 能够水平扩展

由于这些优势,文档数据库是通用数据库,可用于各种用例和行业。

文档数据库被认为是非关系型数据库(或NoSQL数据库)。与存储在固定行和列中的数据不同,文档数据库使用灵活的文档。文档数据库是表格型、关系型数据库的最流行替代品。了解更多关于NoSQL数据库

在这篇文章中,我们将探讨以下问题的答案

什么是文档?

文档是文档数据库中的一个记录。文档通常存储有关一个对象及其相关元数据的信息。

文档以字段值对的形式存储数据。值可以是各种类型和结构,包括字符串、数字、日期、数组或对象。文档可以存储在JSON、BSON和XML等格式中。

以下是一个存储名为Tom的用户信息的JSON文档。

{
     "_id": 1,
     "first_name": "Tom",
     "email": "[email protected]",
     "cell": "765-555-5555",
     "likes": [
        "fashion",
        "spas",
        "shopping"
     ],
     "businesses": [
        {
           "name": "Entertainment 1080",
           "partner": "Jean",
           "status": "Bankrupt",
           "date_founded": {
              "$date": "2012-05-19T04:00:00Z"
           }
        },
        {
           "name": "Swag for Tweens",
           "date_founded": {
              "$date": "2012-11-01T04:00:00Z"
           }
        }
     ]
  }

集合

集合是一组文档。集合通常存储具有类似内容的文档。

由于文档数据库具有灵活的模式,因此集合中的所有文档不一定需要具有相同的字段。请注意,一些文档数据库提供了模式验证,因此当需要时,模式可以锁定。

以上示例继续,包含有关汤姆信息的文档可以存储在一个名为 users 的集合中。可以添加更多文档到 users 集合中,以便存储其他用户的信息。例如,下面存储有关唐娜信息的文档可以添加到 users 集合中。

 {
     "_id": 2,
     "first_name": "Donna",
     "email": "[email protected]",
     "spouse": "Joe",
     "likes": [
        "spas",
        "shopping",
        "live tweeting"
     ],
     "businesses": [
        {
           "name": "Castle Realty",
           "status": "Thriving",
           "date_founded": {
              "$date": "2013-11-21T04:00:00Z"
           }
        }
     ]
  }

请注意,唐娜的文档不包含与汤姆的文档相同的字段。users 集合利用灵活的模式来存储每个用户存在的信息。

CRUD 操作

文档数据库通常有一个 API 或查询语言,允许开发者执行 CRUD(创建、读取、更新和删除)操作。

  • 创建:可以在数据库中创建文档。每个文档都有一个唯一的标识符。
  • 读取:可以从数据库中读取文档。API 或查询语言允许开发者使用其唯一标识符或字段值查询文档。可以通过向数据库添加索引来提高读取性能。
  • 更新:可以更新现有文档——可以是全部或部分。
  • 删除:可以从数据库中删除文档。

文档数据库的关键特性是什么?

文档数据库具有以下关键特性

  • 文档模型:数据存储在文档中(与其他数据库不同,它们在类似表或图的结构中存储数据)。文档映射到大多数流行编程语言中的对象,这使得开发者可以快速开发应用程序。
  • 灵活的模式:文档数据库具有灵活的模式,这意味着集合中的所有文档不需要具有相同的字段。请注意,一些文档数据库支持模式验证,因此模式可以选择性地锁定。
  • 分布式和健壮:文档数据库是分布式的,这允许水平扩展(通常比垂直扩展便宜)和数据分布。文档数据库通过复制提供健壮性。
  • 通过 API 或查询语言进行查询:文档数据库具有 API 或查询语言,允许开发者执行数据库上的 CRUD 操作。开发者可以根据唯一标识符或字段值查询文档。

什么使得文档数据库与关系数据库不同?

三个关键因素区分文档数据库和关系数据库

1. 数据模型的直观性:文档映射到代码中的对象,因此它们更容易处理。无需在表之间分解数据,执行昂贵的连接或集成单独的对象关系映射(ORM)层。访问在一起的数据存储在一起,因此开发者需要编写的代码更少,最终用户获得更高的性能。
2. JSON 文档的普遍性:JSON 已经成为数据交换和存储的既定标准。JSON 文档轻量级、语言无关且可读。文档是所有其他数据模型的超集,因此开发者可以以应用程序所需的方式结构化数据——丰富对象、键值对、表、地理空间和时间序列数据,或图中的节点和边。
3. 模式的灵活性:文档的模式是动态的且自我描述的,因此开发者不需要首先在数据库中预定义它。字段可以从文档到文档变化。开发者可以在任何时候修改结构,避免破坏性的模式迁移。一些文档数据库提供模式验证,因此可以选择性地强制执行控制文档结构的规则。

了解更多关于 NoSQL 与关系数据库的区别.

文档与表格相比工作起来有多容易?

开发者通常认为在文档中处理数据比在表格中处理数据更容易、更直观。文档映射到大多数流行编程语言的数据结构。开发者不必担心在存储时手动将相关数据分割到多个表格中,或在检索时将它们重新组合。他们也不需要使用ORM来处理数据的操作。相反,他们可以直接在应用程序中轻松处理数据。

让我们再来看看一个名为Tom的用户文档。

用户

{
     "_id": 1,
     "first_name": "Tom",
     "email": "[email protected]",
     "cell": "765-555-5555",
     "likes": [
        "fashion",
        "spas",
        "shopping"
     ],
     "businesses": [
        {
           "name": "Entertainment 1080",
           "partner": "Jean",
           "status": "Bankrupt",
           "date_founded": {
              "$date": "2012-05-19T04:00:00Z"
           }
        },
        {
           "name": "Swag for Tweens",
           "date_founded": {
              "$date": "2012-11-01T04:00:00Z"
           }
        }
     ]
  }

关于Tom的所有信息都存储在一个文档中。

现在让我们考虑如何将相同的信息存储在关系型数据库中。我们将首先创建一个表来存储用户的基本信息。

用户

IDfirst_nameemailcell
1Tom[email protected]765-555-5555

用户可以喜欢许多事物(这意味着用户和喜欢之间存在一对一的关系),因此我们将创建一个名为“Likes”的新表来存储用户的喜好。Likes表将有一个外键,引用Users表中的ID列。

喜好

IDuser_idlike
101时尚
111水疗中心
121购物

同样,用户可以经营许多企业,因此我们将创建一个名为“Businesses”的新表来存储企业信息。Businesses表将有一个外键,引用Users表中的ID列。

企业

IDuser_idnamepartnerstatusdate_founded
201Entertainment 1080Jean破产2011-05-19
211Swag for TweensNULLNULL2012-11-01

在这个简单的例子中,我们可以看到用户数据可以在文档数据库中存储在一个单独的文档中,或者关系型数据库中的三个表中。当开发者在文档数据库中检索或更新用户信息时,他们可以编写一个零连接的查询。与数据库的交互是直接的,并且在数据库中建模数据是直观的。

访问从SQL到MongoDB映射术语和概念了解更多信息。

文档数据库与其他数据库之间有什么关系?

文档模型是其他数据模型的超集,包括键值对、关系型、对象、图和地理空间。

  • 键值对可以用文档中的字段和值来建模。文档中的任何字段都可以建立索引,为开发者提供在查询数据时的额外灵活性。
  • 关系型数据可以通过将相关数据保留在单个文档中(使用嵌入文档和数组)以不同的方式(有些人可能会认为更直观)来建模。相关数据也可以存储在单独的文档中,并且可以使用数据库引用来连接相关数据。
  • 文档映射到大多数流行编程语言中的对象
  • 节点和/或边可以建模为文档。边也可以通过数据库引用来建模。可以使用如$graphLookup之类的操作来运行图查询。
  • 地理空间数据可以建模为文档中的数组。

一个四层图:1. 文档模型 2. 键值对、关系型、对象、图、地理空间 3. 统一接口 4. 事务、搜索、移动、实时分析、数据湖 文档模型是其他数据模型的超集

由于它们强大的数据建模能力,文档数据库是一种通用数据库,可以存储各种用例的数据。

为什么不在关系型数据库中使用JSON?

随着文档数据库使开发者能够更快地构建应用程序,大多数关系型数据库已经增加了对JSON的支持。然而,仅仅添加JSON数据类型并不能带来对JSON有原生支持的数据库的好处。为什么?因为关系型方法会降低开发者生产力,而不是提高它。以下是开发者必须处理的一些问题。

专有扩展

与文档一起工作意味着使用定制的、供应商特定的SQL函数,这些函数对大多数开发者来说不熟悉,并且无法与您最喜欢的SQL工具一起工作。添加低级JDBC/ODBC驱动程序和ORM,您将面临复杂的发展过程,导致低生产力。


原始数据处理

将JSON数据呈现为简单的字符串和数字,而不是像MongoDB这样的原生文档数据库所支持的丰富数据类型,使得计算、比较和排序数据变得复杂且容易出错。


差的数据质量与僵化的表

关系型数据库在验证文档模式方面提供的支持很少,因此您无法对您的JSON数据应用质量控制。并且,您仍然需要为您的常规表格数据定义一个模式,当您的应用程序功能发展时,需要更改表格时,将涉及所有额外的开销。


低性能

大多数关系型数据库不维护JSON数据的统计信息,阻止查询计划器针对文档优化查询,以及您调整查询。


无原生扩展性

传统的数据库关系型数据库没有提供一种方法来在多个实例之间分区(分片)数据库,以随着工作负载的增长而扩展。相反,您必须自己在应用程序层实现分片,或者依赖昂贵的扩展系统。

文档数据库的优缺点是什么?

文档数据库有许多优点

  • 文档模型无处不在,直观,并能够实现快速软件开发。
  • 灵活的模式允许数据模型随着应用程序需求的变化而变化。
  • 文档数据库具有丰富的API和查询语言,使开发者能够轻松地与他们的数据交互。
  • 文档数据库是分布式的(允许横向扩展以及全球数据分布)并且是弹性的。

这些优点使文档数据库成为通用数据库的优秀选择。

关于文档数据库的常见弱点是许多不支持多文档ACID事务。我们估计,80%-90% 的利用文档模型的应用程序将不需要使用多文档事务

请注意,一些文档数据库,如MongoDB支持多文档ACID事务。

访问什么是ACID事务?了解更多关于文档模型如何主要消除多文档事务的需求以及MongoDB如何在需要时支持事务的信息。

文档数据库有哪些用例?

文档数据库是通用数据库,适用于事务型和分析应用程序的多种用例。

  • 单一视图或数据枢纽
  • 客户数据管理和个性化
  • 物联网(IoT)和时间序列数据
  • 产品目录和内容管理
  • 支付处理
  • 移动应用
  • 大型机卸载
  • 运营分析
  • 实时分析

访问使用案例指南:在哪里使用MongoDB了解有关上述每个应用程序的更多信息。

总结

文档数据库利用直观灵活的文档数据模型来存储数据。文档数据库是一种通用数据库,可用于各行各业的各种用例。

通过在MongoDB Atlas中创建数据库来开始使用文档数据库,MongoDB的开发者数据平台。Atlas提供慷慨的永久免费层,您可以使用它来实验和探索文档模型。

使用MongoDB Atlas中的示例数据免费尝试文档的力量

常见问题解答

文档数据库有什么好处?

文档数据库是一种通用数据库,可用于各行各业的各种用例。访问何时使用NoSQL了解更多信息。

MongoDB是文档数据库吗?

是的,MongoDB是一种通用文档数据库。

文档数据库的例子是什么?

MongoDB是全球最受欢迎的文档数据库。其他文档数据库的例子包括CouchDB和Firebase。

文档数据库是如何工作的?

文档数据库在文档中存储信息。文档数据库具有丰富的API和查询语言,可以用于执行CRUD(创建、读取、更新和删除)操作。它们具有灵活的模式,允许开发人员根据其应用程序需求的变化轻松地演进其数据模型。

文档是如何在数据库中存储的?

文档数据库在文档中存储信息。每个文档通常包含有关一个对象及其任何相关元数据的信息。具有类似内容的文档在集合中分组。集合组存储在数据库中。

文档中的哪个字段总是第一个字段?

在MongoDB中,每个文档的第一个字段命名为_id。该_id字段充当文档的唯一标识符。有关更多信息,请参阅官方MongoDB文档

请注意,每个文档数据库管理系统都有自己的字段要求。

MongoDB数据是如何存储的?

MongoDB使用BSON(二进制JSON)文档存储数据。

MongoDB免费使用吗?

是的,MongoDB有两个免费选项

文档数据库与关系数据库的比较

文档数据库与关系数据库之间最明显的区别是数据建模的方式。文档数据库通常使用灵活的类似JSON的文档,其中包含字段-值对来建模数据。关系数据库通常使用具有固定行和列的刚性表来建模数据。