文档数据库具有多种优势,包括:
得益于这些优势,文档数据库是通用数据库,可用于各种应用场景和行业。
文档数据库被认为属于非关系(或 NoSQL)数据库。文档数据库不再将数据存储在固定的行和列中,而是使用灵活的文档格式。文档数据库是传统关系数据库表格模型最常用的替代方案。详细了解 NoSQL 数据库。
文档是文档数据库中的记录。文档通常存储有关一个对象及其相关元数据的的信息。文档以“字段-值”对的形式存储数据。值可以是各种类型和结构,包括字符串、数字、日期、数组或对象。文档可以存储为 JSON、BSON 和 XML 等格式。
以下是一个 JSON 文档,其中存储了名为 Tom 的用户的信息。
{
"_id": 1,
"first_name": "Tom",
"email": "tom@example.com",
"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"
}
}
]
}
A collection is a group of documents. 通常,集合会存储具有相似内容的文档。
由于文档数据库具有灵活的架构,集合中的所有文档并不需要具有相同的字段。请注意,某些文档数据库提供模式验证,因此可以在需要时选择性地锁定该架构。
继续上面的示例,包含关于 Tom 信息的文档可以存储在名为“users”的集合中。可以向“users”集合中添加更多文档,以存储其他用户的信息。例如,下面存储有关 Donna 信息的文档可以添加到“users”集合中。
{
"_id": 2,
"first_name": "Donna",
"email": "donna@example.com",
"spouse": "Joe",
"likes": [
"spas",
"shopping",
"live tweeting"
],
"businesses": [
{
"name": "Castle Realty",
"status": "Thriving",
"date_founded": {
"$date": "2013-11-21T04:00:00Z"
}
}
]
}
请注意,Donna 的文档不包含与 Tom 的文档相同的字段。“users”集合利用灵活的架构来存储每个用户的信息。
文档数据库通常具有 API 或查询语言,可允许开发者执行 CRUD(创建、读取、更新和删除)操作。
文档数据库具有以下关键特性:
开发者通常发现,在文档中处理数据比在表格中处理数据更容易且更直观。文档映射到大多数常用编程语言中的数据结构。开发者在存储相关数据时不必担心手动将其拆分到多个表中,或在检索时将其重新合并。开发者也不需要使用 ORM 来处理数据操作,而是可以轻松地直接在其应用程序中处理数据。让我们再查看一个名为 Tom 的用户的文档。
Users
{
"_id": 1,
"first_name": "Tom",
"email": "tom@example.com",
"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 相关的信息都存储在一个文档中。
现在,让我们考虑如何将相同的信息存储在关系数据库中。我们首先创建一个存储用户基本信息的表。
Users
ID | first_name | cell | |
---|---|---|---|
1 | Tom | tom@example.com | 765-555-5555 |
用户可以点赞很多内容(这意味着用户和点赞之间存在一对多的关系),因此我们将创建一个名为“Likes”的新表来存储用户的点赞。“Likes”表将具有一个外键,引用“Users”表中的 ID 列。
Likes
ID | user_id | like |
---|---|---|
10 | 1 | fashion |
11 | 1 | spas |
12 | 1 | shopping |
同样,用户可以经营许多企业,因此我们将创建一个名为“Businesses”的新表来存储企业信息。“Businesses”表将具有一个外键,引用“Users”表中的“ID”列。
Businesses
ID | user_id | name | partner | status | date_founded |
---|---|---|---|---|---|
20 | 1 | Entertainment 1080 | Jean | Bankrupt | 2011-05-19 |
21 | 1 | Swag for Tweens | NULL | NULL | 2012-11-01 |
在这个简单的示例中,我们看到用户的相关数据可以存储在文档数据库的单个文档中,也可以存储在关系数据库的三个表中。当开发者想要在文档数据库中检索或更新用户信息时,他们可以编写一个无需连接的查询。与数据库的交互非常简单,数据库中的数据建模也很直观。请访问从 SQL 到 MongoDB 的术语和概念映射,了解更多信息。
文档模型是其他数据模型的超集,包括键值对、关系、对象、图表和地理空间。
文档模型是其他数据模型的超集_
由于具有丰富的数据建模功能,文档数据库是通用数据库,可用于存储各种应用场景的数据。
随着文档数据库赋能开发者更加快速地构建应用,大多数关系数据库都增加了对 JSON 的支持。但是,简单地添加 JSON 数据类型并不能带来具有原生 JSON 支持的数据库的益处。为什么?这是因为关系方法降低了开发者的工作效率,而不是提高工作效率。这是开发者必须要面对的问题。
处理文档意味着使用定制、供应商相关的 SQL 函数,这些函数对大多数开发者来说并不熟悉,并且无法与您喜欢的 SQL 工具一起使用。添加低级别的 JDBC/ODBC 驱动程序和 ORM,您将面临复杂的开发流程,导致工作效率低下。
将 JSON 数据呈现为简单的字符串和数字,而不是像 MongoDB 这样的原生文档数据库支持的丰富数据类型,使得计算、比较和排序数据变得复杂且容易出错。
关系数据库几乎没有提供验证文档架构的功能,因此您无法对您的 JSON 数据进行质量控制。您仍然需要为常规表格数据定义一个架构,当您需要随着应用程序功能的发展而更改表格时,就会产生额外的开销。
大多数关系数据库并不维护 JSON 数据的统计信息,从而阻止查询规划器优化针对文档的查询,以及阻碍您调优查询。
传统的关系数据库无法让您跨多个实例对数据库进行分区(分片),以随着工作负载的增长进行扩展。相反,您必须自行在应用程序层实施原生分片集群,或者依赖成本高昂的扩展系统。
文档数据库的优点和缺点是什么?文档数据库有许多优点:
这些优势使文档数据库成为通用数据库的绝佳选择。
人们常提到的文档数据库具有一个常见的弱点,那就是许多数据库并不支持多文档 ACID 事务。我们估计,80%-90% 的利用文档模型的应用程序将不需要使用多文档事务。
请注意,一些文档数据库(例如 MongoDB)支持多文档 ACID 事务。
访问什么是 ACID 事务?,详细了解文档模型如何在很大程度上消除多文档事务的需求,以及 MongoDB 如何在少数情况下支持事务需求。
文档数据库是通用数据库,可支持多种事务和分析应用程序场景:
访问应用场景指南:在哪些情况下使用 MongoDB,详细了解关于上面列出的每个应用程序的信息。
文档数据库利用直观、灵活的文档数据模型来存储数据。文档数据库是通用数据库,可用于各种行业 的多种应用场景。
立即开始使用文档数据库,只需在 MongoDB Atlas 中创建数据库即可,这是 MongoDB 的开发者数据平台Atlas 提供一个慷慨的永久免费套餐,您可以用来实验和探索文档模型。
MongoDB 将数据存储在 BSON (二进制 JSON)文档中。
是的,MongoDB 有两个免费选项:
文档数据库和关系数据库之间最明显的区别是数据建模的方式。文档数据库通常使用灵活的 JSON 类文档和字段-值对来建模数据。关系数据库通常使用具有固定行和列的刚性表格来建模数据。