MongoDB入门
1、NoSQL是什么
最常见的数据库可以分为下面的两种类型:
- RDBMS(关系型数据库):常见的关系型数据库有 Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL;
- NoSQL(非关系型数据库):常见的非关系型数据库有 MongoDB、Redis、Voldemort、Cassandra、Riak、Couchbase、CouchDB 等。
这里我们主要来介绍一下 NoSQL,NoSQL 全称为“Not only SQL”,它仅仅是一个概念,用来表示非关系型数据库,本教程中将要介绍的 MongoDB 就是非关系型数据库的一种。
相对于 RDBMS(关系型数据库),NoSQL 具有以下优点:
- 易扩展:NoSQL 数据库种类繁多,但它们都有一个共同的特点,那就是都去掉了关系型数据库的关系型特性,数据与数据之间没有关系,这样就非常容易扩展,无形之间也在架构的层面上带来了可扩展的能力;
- 大数据量,高性能:NoSQL 数据库都具有非常高的读写性能,尤其是在处理庞大数据时表现优秀;
- 灵活:NoSQL 随时都可以存储任意类型的数据,无须提前为要存储的数据建立字段;
- 高可用:NoSQL 在不太影响性能的情况下,就可以方便地实现高可用的架构,比如 Cassandra、HBase 模型,通过复制模型也能实现高可用。
NoSQL 简史
NoSQL 一词最早出现于 1998 年,是 Carlo Strozzi 开发的一个轻量、开源、不提供 SQL 功能的关系型数据库。
2009 年,Johan Oskarsson 发起了一次关于分布式开源数据库的讨论,来自 Rackspace 的 Eric Evans 再次提出了 NoSQL 的概念,这时的 NoSQL 主要指非关系型、分布式、不遵循 ACID 原则的数据库设计模式。
为什么使用 NoSQL?
随着互联网的不断发展,传统的关系型数据库在处理超大规模数据以及开发高并发应用时已经显得力不从心了,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL 数据库的产生就是为了解决大规模数据集合多重数据种类带来的问题,特别是大数据应用的难题。
体系框架
NoSQL 整体框架分为四层,由下至上分别为数据持久层(data persistence)、整体分布层(data distribution model)、数据逻辑模型层(data logical model)、和接口层(interface),层次之间相辅相成,协调工作。
1、数据持久层
数据持久层定义了数据的存储形式,主要包括基于内存、硬盘、内存与硬盘相结合、订制可插拔四种形式。
- 基于内存形式的数据存取速度最快,但可能会造成数据丢失;
- 基于硬盘的数据可能保存很久,但存取速度较基于内存的形式慢;
- 内存和硬盘相结合的形式,结合了前两种形式的优点,既保证了速度,又保证了数据不丢失;
- 订制可插拔则保证了数据存取具有较高的灵活性。
2、数据分布层
数据分布层定义了数据是如何分布的,相对于关系型数据库,NoSQL 可选的机制比较多,主要有三种形式:
- CAP 支持:可用于水平扩展;
- 多数据中心支持:可以保证在横跨多数据中心时也能够平稳运行;
- 动态部署支持:可以在运行着的集群中动态地添加或删除节点。
3、数据逻辑层
数据逻辑层表述了数据的逻辑表现形式,与关系型数据库相比,NoSQL 在逻辑表现形式上相当灵活,主要有四种形式:
- 键值模型:这种模型在表现形式上比较单一,却有很强的扩展性;
- 列式模型:这种模型相比于键值模型能够支持较为复杂的数据,但扩展性相对较差;
- 文档模型:这种模型对于复杂数据的支持和扩展性都有很大优势;
- 图模型:这种模型的使用场景不多,通常是基于图数据结构的数据定制的。
4、接口层
接口层为上层应用提供了方便的数据调用接口,提供的选择远多于关系型数据库。接口层提供了五种选择,分别是 Rest、Thrift、Map/Reduce、Get/Put 和特定语言 API,使得应用程序在与数据库交互时更加方便。
NoSQL 分层架构并不代表每个产品在每一层只有一种选择。相反,这种分层设计提供了很大的灵活性和兼容性,每种数据库在不同层面可以支持多种特性。
适用场景
NoSQL 数据库在以下的这几种情况下比较适用:
- 数据模型比较简单;
- 对灵活性要求很强的系统;
- 对数据库性能要求较高;
- 不需要高度的数据一致性;
- 对于给定 key,比较容易映射复杂值的环境。
2、MongoDB是什么
MongoDB 是一个开源的、可扩展的、跨平台的、面向文档的非关系型数据库,它由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
在 MongoDB 中支持以类似 json 的 bson(一种计算机数据交换格式)格式来存储数据,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象语言中函数调用,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还可以对数据建立索引。
MongoDB 官网:https://www.mongodb.com/
MongoDB 发展史
MongoDB 最初由一个名为 10gen 的组织在 2007 年开发的,并在 2009 年 2 月发布了 MongoDB 1.0 版本,其中提供了大部分基本的查询功能。
2009 年 12 月发布了 MongoDB 1.2 版本,其中引入了 map-reduce(一种编程模型,用于大规模数据集(大于 1TB)的并行运算),让 MongoDB 拥有了支持大规模数据处理的能力。
2010 年 3 月发布了 MongoDB 1.4 版本,该版本中引入了创建后台索引的功能。
2010 年 8 月发布了 MongoDB 1.6 版本,该版本种引入了一些主要特性,比如用于水平伸缩的分片、具备自动故障转移能力的副本集以及对 IPv6 的支持。
2012 年 8 月发布了 MongoDB 2.2 版本,该版本引入了聚合管道功能,可以将多个数据处理步骤组合成一个操作链。
2013 年 3 月发布了 MongoDB 2.4 版本,并在 Mongo Shell(一个与 MongoDB 交互的组件)中引入了文本搜索和谷歌的 V8 JS 引擎等增强功能。另外,还发布了 MongoDB 的企业版,企业版中另外提供了监控和安全集成等附加功能。
2015 年 3 月发布了 MongoDB 3.0 版本,该版本中引入了新的 WiredTiger 存储引擎、可插拔存储引擎 API 并增加了 50 个副本集限制和安全改进。同年晚些时候又发布了 MongoDB 3.2 版本,该版本增加了文档验证、部分索引的功能。
2017 年 11 月发布了 MongoDB 3.6 版本,该版本为多集合连接查询、变更流和使用 JSON 模式进行文档验证提供了更好的支持。MongoDB 3.6 是微软 Azure CosmosDB(截止到 2020 年 8 月)能够支持的最新版本。
2018 年 6 月发布了 MongoDB 4.0 版本,该版本提供了跨文档处理事务的能力。
2019 年 8 月发布了 MongoDB 4.2 版本,该版本中引入分布式事务处理的能力。
为什么要使用 MongoDB
市面上的数据库软件众多,我们为什么要选择 MongoDB 呢?换句话说就是 MongDB 有什么优势呢?下面列举了几点原因。
1) 面向文档
由于 MongoDB 是 NoSQL 类型的数据库,它不是像关系类型数据库那样以固定的格式存储数据,而是将数据存储在文档中,这使 MongoDB 非常灵活,可以适应实际的商业环境和需求;
2) 临时查询
MongoDB 支持按字段、范围和正则表达式查询并返回文档中的数据;
3) 索引
可以创建索引以提高 MongoDB 中的搜索性能,文档中的任何字段都可以建立索引;
4) 复制
MongoDB 支持高可用性的副本集。副本集由两个或多个 MongoDB 数据库实例组成,每个副本集成员可以随时充当主副本或辅助副本的角色,主副本是与客户端交互并执行所有读/写操作的主服务器。辅助副本使用内置复制维护主副本种的数据。当主副本失败时,副本集将自动切换到辅助副本,然后将辅助副本作为主服务器;
5) 负载平衡
MongoDB 可以在多台服务器上运行,以平衡负载或复制数据,以便在硬件出现故障时保持系统正常运行。
适用场景
MongoDB 的主要目标是在键/值存储方式和传统的 RDBMS(关系型数据库)系统之间架起一座桥梁,它集两者的优势于一身。根据官方网站的描述,MongoDB 适用于以下场景。
1) 网站数据
MongoDB 非常适合实时的插入、更新与查询数据,并具备网站实时存储数据所需的复制及高度伸缩的特性;
2) 缓存
由于性能很高,MongoDB 也适合作为信息基础设施的缓存层,在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载;
3) 庞大的、低价值的数据
使用传统的关系型数据库存取大量数据时,数据库的运行效率往往并不尽人意,而 MongoDB 的出现使这个问题迎刃而解,MongoDB 非常适合庞大数据的存储;
4) 高伸缩性的场景
MongoDB 内置了 MapReduce 引擎,因此非常适合由数十或数百台服务器组成的数据库;
5) 用于对象及 JSON 数据的存储
MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询。
说了这么多 MongoDB 的好处,但它也不是万能的,比如以下这几个地方就不适合使用 MongoDB:
- 高度事务性的系统:例如银行或会计系统,传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序;
- 传统的商业智能应用:针对特定问题的 BI(全称“Business Intelligence”,中文意思为“商业智慧或商务智能”,指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值)数据库会产生高度优化的查询方式,对于此类应用,数据仓库可能是更合适的选择;
- 需要复杂 SQL 查询的应用。
3、Windows安装MongoDB(图解)
通过前面的介绍我们已经简单的了解了 MongoDB,本节我们来看看如何在 Windows 系统上安装 MongoDB。
下载 MongoDB
要在 Windows 系统上安装 MongoDB,首先需要在 MongoDB 的官网(https://www.mongodb.com/try/download/community)下载 MongoDB 的安装包,如下图所示:
图:下载 MongoDB 安装包
提示:下载前需要先注册/登陆 MongoDB 官网的账号。
安装 MongoDB
【步骤 1】双击运行我们刚刚下载的 .msi 格式的 MongoDB 安装包,在弹出的窗口种单击 Next,如下图所示:
图:运行 MongoDB 安装包
【步骤 2】接受用户许可协议,并单击 Next,如下图所示:
图:接受用户协议
【步骤 3】单击 Custom(自定义)按钮来自定义安装,如下图所示:
图:自定义安装
【步骤 4】修改安装目录,并单击 Next,如下图所示:
图:自定义安装目录
【步骤 5】选中“Install MongoD as a Service”,并在下面的选项中选择“Run service as Network Service user”,完成后单击 Next,如下图所示:
图:安装 Windows 服务
【步骤 6】取消“Install MongoDB Compass”的勾选(当然您也可以选择安装它,但这样就需要花费更久的安装时间),MongoDB Compass 是一个图形界面管理工具,后面如果需要我们也可以再单独下载(https://www.mongodb.com/try/download/compass)和安装它,完成上述操作后单击 Next,如下图所示:
图:取消“Install MongoDB Compass”的勾选
【步骤 7】单击“Install”按钮开始安装。
图:开始安装
【步骤 8】等待安装完成,单击“Finish”按钮退出安装程序即可完成安装。
图:完成安装
验证安装
不出意外的话,完成上面的一系列操作后 MongoDB 就成功安装到您的电脑上了。想要验证安装是否成功,您可以打开“服务”,如果能在服务列表中找到 MongoDB Server,就说明 MongoDB 已经安装成功。
图:MongoDB Server 服务
4、Linux安装MongoDB(图解)
MongoDB 是跨平台的,既可以在 Windows 系统下安装,也可以在 Linux 系统下安装,本节我们就来介绍一下如何在 Linux 系统下安装 MongoDB。
下载 MongoDB
MongoDB 官方提供了多种 Linux 发行版的安装包,您可以在官网下载合适的版本。在安装 MongoDB 前我们需要先安装 Linux 平台的依赖包,安装方法如下:
Red Hat/CentOS:
sudo yum install libcurl openssl
Ubuntu 18.04 LTS ("Bionic")/Debian 10 "Buster":
sudo apt-get install libcurl4 openssl
Ubuntu 16.04 LTS ("Xenial")/Debian 9 "Stretch":
sudo apt-get install libcurl3 openssl
待依赖包安装完成后,我们就可以去 MongoDB 官网(https://www.mongodb.com/try/download/community)下载合适的安装包了,如下图所示:
图:MongoDB 官网
注意:以下演示过程都是在 CentOS 系统下进行的。
我们选择好要使用的安装包后并不需要在浏览器中直接下载,只需要复制下载链接即可,之后使用 Linux 命令来下载 MongoDB 的安装包,如下所示:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.3.tgz
安装 MongoDB
相对于在 Windows 下安装 MongoDB,在 Linux 系统下安装 MongoDB 要简单很多,只需简单的几步即可。
【步骤 1】解压下载好的安装包,并将解压得到的文件移动到指定的目录中,命令如下:
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.3.tgz # 解压
mv mongodb-src-r4.4.3 /usr/local/mongodb # 将解压后的文件拷贝到指定目录
【步骤 2】打开系统配置文件,命令如下:
sudo vi /etc/profile
接下来在 vim 编辑器中按i
或者insert
键来进入 insert 模式对系统配置文件进行编辑,并在配置文件中添加如下配置信息:
export PATH =
其中
export PATH=/usr/local/mongodb4/bin:$PATH
编辑完成后按esc
键退出 insert 模式,然后按shift + :
键并输入wq
来保存并退出系统配置文件。
系统配置文件保存成功后可以使用如下命令来使配置文件生效:
source /etc/profile
【步骤 3】创建数据库目录,默认情况下 MongoDB 启动后会初始化以下两个目录:
- 数据存储目录:/var/lib/mongodb
- 日志文件目录:/var/log/mongodb
所以我们在启动 MongoDB 前可以先创建这两个目录并设置读写权限,命名如下:
sudo mkdir -p /var/lib/mongodb
sudo mkdir -p /var/log/mongodb
sudo chown whoami
/var/lib/mongodb # 设置权限
sudo chown whoami
/var/log/mongodb # 设置权限
其中mkdir -p
命令用来确保目录名称存在,如果不存在就建一个。chown
whoami``命令用来指定文件所有者为用户自身,whoami
为显示自身名称的命令。
启动 MongoDB
完成上述步骤后 MongoDB 就安装完成了,您可以使用下面的命令来启动 MongoDB 服务:
mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --fork
输入tail -10f /var/log/mongodb/mongod.log
命令,若看到类似下面的信息则说明 MongoDB 运行成功:
{"t":{"$date":"2021-02-05T13:10:40.423+08:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"/tmp/mongodb-27017.sock"}}
{"t":{"$date":"2021-02-05T13:10:40.424+08:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"127.0.0.1"}}
{"t":{"$date":"2021-02-05T13:10:40.424+08:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
5、MacOS安装MongoDB(图解)
在 Mac OS 系统下安装 MongoDB 与在 Linux 下安装比较相似,本节我们就来详细介绍一下 Mac OS 系统下如何安装 MongoDB。
下载 MongoDB
与在 Linux 系统下安装 MongoDB 相同,首先我们需要在 MongoDB 的官网获得 MongoDB 安装包的下载链接,如下图所示:
图:MongoDB 官网
得到下载链接后,使用cd
命令进入 /usr/local 目录,然后使用wget
命令下载 MongoDB 的压缩包,命令如下:
cd /usr/local
sudo wget https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.4.3.tgz
安装 MongoDB
待压缩包下载完成后就可以尝试安装 MongoDB 了,具体的安装步骤如下:
【步骤 1】解压缩刚刚下载的压缩包,并将其重命名为 mongodb:
sudo tar -zxvf mongodb-macos-x86_64-4.4.3.tgz # 解压 MongoDB 压缩包
sudo mv mongodb-osx-ssl-x86_64-4.0.17/ mongodb # 重命名解压得到的文件夹
【步骤 2】在 /usr/local/mongodb 目录下新建两个文件夹 data 和 log,用于存储 MongoDB 的数据和日志。
sudo mkdir -p /usr/local/mongodb/data
sudo mkdir -p /usr/local/mongodb/log
使用如下命令为当前用户分配目录的读写权限:
sudo chown biancheng /usr/local/mongodb/data
sudo chown biancheng /usr/local/mongodb/log
其中“biancheng”为当前的用户名,您需要修改为您当前系统的用户名。
【步骤 3】配置 PATH。在终端中输入open -e .bash_profile
命令打开 bash_profile 配置文件,然后将 MongoDB 的安装目录下的 bin 目录添加到环境变量中,如下所示:
export PATH=${PATH}:/usr/local/mongodb/bin
编辑完成后保存并退出,然后使用source .bash_profile
命令使配置立即生效。
【步骤 4】使用下面的命令来启动 MongoDB 服务:
mongod --dbpath /usr/local/mongodb/data --logpath /usr/local/mongodb/log/mongo.log --fork
参数说明如下:
- --dbpath 用来设置数据的存放目录;
- --logpath 用来设置日志的存放目录;
- --fork 用来设置在后台运行。
至此 MongoDB 就安装完成了。
验证安装
您可以使用mongod -version
命令来验证 MongoDB 是否安装成功,如果出现类似下面所示的内容,则说明 MongoDB 安装成功。
mongod -version
db version v4.0.10
git version: c389e7f69f637f7a1ac3cc9fae843b635f20b766
allocator: tcmalloc
modules: none
build environment:
distmod: 2008plus-ssl
distarch: x86_64
target_arch: x86_64
6、MongoDB常用概念解析
前面我们介绍了在不同的系统下安装 MongoDB,在具体学习 MongoDB 的操作之前,我们先来介绍一些 MongoDB 中的基本概念。
数据库
数据库是用于存储数据的物理容器,每个数据库在文件系统中都有属于自己的文件集。一台 MongoDB 服务器中可以创建多个数据库,并且每个数据库都是独立的,都有属于自己的集合和权限,而且不同数据库中的数据会放置在不同的文件中。
MongoDB 的默认数据库为“test”,该数据库存储在 data 目录中,您可以使用show dbs
命令来查看所有的数据库列表,如下所示:
\> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
注意:在使用show dbs
命令时,若数据库中没有存储任何数据,则不会在列表中显示出来,也就是说只有非空数据库才能通过show dbs
命令查看。
集合
集合就是一组 MongoDB 文档的组合,类似于关系型数据库(例如 MySQL)中的数据表。集合存在于数据库中,且没有固定的结构,您可以向集合中插入不同格式或类型的数据。
文档
文档是 MongoDB 中数据的基本单位,由 BSON 格式(一种计算机数据交换格式,类似于 JSON)的键/值对组成,类似于关系型数据库中的一行行数据,但要相对复杂一些。
文档具有动态模式,所谓动态模式就是同一集合中的文档不需要具有相同的字段,即使是相同的字段也可以是不同的类型,这与关系型数据库有很大的区别,也是 MongoDB 最突出的特点之一。
下表列举了关系型数据库与 MongoDB 中的一些差异:
关系型数据库 | MongoDB | 解释说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据表/集合 |
row | document | 数据行/文档 |
column | field | 字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB 中不支持 | |
primary key | primary key | 主键,MongoDB 会自动将 _id 字段设置为主键 |
下面的示例中展示了一个简单的文档结构:
{
_id: ObjectId(601e288aaa203cc89f2d31a7),
title: 'MongoDB Concept',
description: 'MongoDB is no sql database',
by: '编程帮',
url: 'http://www.biancheng.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2011,1,20,2,15),
like: 0
},
{
user:'user2',
message: 'My second comments',
dateCreated: new Date(2011,1,25,7,45),
like: 5
}
]
}
上面示例中 _id 是一个 12 字节的十六进制数字,可确保每个文档的唯一性。您可以在插入文档时提供 _id 的具体值,但如果您不提供,那么 MongoDB 将为每个文档提供一个唯一的值。自动生成的 _id 中前 4 个字节是当前的时间戳,之后的 3 个字节是机器 id,再之后 2 个字节是 MongoDB 服务器的进程 id,剩下的 3 个字节是简单的随机数。
7、MongoDB数据类型汇总
下表中列举了 MongoDB 中常用的几种数据类型:
数据类型 | 描述 |
---|---|
String | 字符串类型,是最常用的数据类型,不过在 MongoDB 中,只有 UTF-8 编码的字符串才是合法的 |
Integer | 整型,用于存储数值。根据您使用服务器的不同,整型可以分为 32 位或 64 位两种 |
Boolean | 布尔型,用于存储布尔类型的值(true/false) |
Double | 双精度浮点型,用于存储浮点型(小数)数据 |
Min/Max keys | 将一个值与 BSON 元素的最低值和最高值相对比 |
Array | 数组类型,用于将数组、列表或多个值存储在一个键中 |
Timestamp | 时间戳,记录文档修改或添加的具体时间 |
Object | 用于内嵌文档 |
Null | 用于创建空值 |
Symbol | 符号,该数据类型于字符串类型类似,不同的是,它一般用于采用特殊符号类型的语言 |
Date | 日期时间,用 UNIX 时间格式来存储当前日期或时间,您可以创建 Date 对象并将 date、month、year 的值传递给 Date 对象来指定自己的日期时间 |
Object ID | 对象 ID,用于创建文档的 ID |
Binary Data | 二进制数据,用于存储二进制数据 |
Code | 代码类型,用于在文档中存储 JavaScript 代码 |
Regular expression | 正则表达式类型,用于存储正则表达式 |
下面简单介绍一下其中几个比较重要的类型:
Object ID
Object ID 类似于关系型数据库中的主键 ID,在 MongoDB 中 Object ID 由 12 字节的字符组成,其中:
- 前 4 个字节表示当前的 Unix 时间戳;
- 之后的 3 个字节是当前设备的机器标识码;
- 再之后的 2 个字节是 MongoDB 服务器的进程 id;
- 最后 3 个字节为计数器,计数器的起始值随机获得。
601e2b6b aa203c c89f 2d31aa
↑ ↑ ↑ ↑
时间戳 机器码 进程id 计数器
Timestamps
Timestamps(时间戳)类型用来在 MongoDB 的内部使用,与 Date 类型不同,Timestamps 由一个 64 位的值构成,其中:
- 前 32 位是一个 Unix 时间戳(由 Unix 纪元(1970.1.1)开始到现在经过的秒数);
- 后 32 位是一秒内的操作序数。
在一个 MongoDB 实例中,时间戳是唯一的,而且主要在 MongoDB 内部使用,在应用开发中,您可以使用 Date 类型来定义时间日期。
Date
Date 类型是一个 64 位的对象,其中存放了从 Unix 纪元(1970.1.1)开始到现在经历的毫秒数,Date 类型是有符号的,负值则表示 1970.1.1 之前的时间。
\> var mydate = new Date()
\> mydate
ISODate("2021-02-06T08:50:37.024Z")
\> typeof mydate
object
8、MongoDB数据模型
在 MongoDB 中存储数据非常灵活,它与关系型数据库完全不同,在关系型数据库中,插入数据之前必须先确定数据表的结构并创建数据表。而 MongoDB 中对文档的结构没有强制要求,只要合理即可。
数据模型设计
MongoDB 提供了两种数据模型,分别是嵌入式数据模型和规范化数据模型,您可以根据需要使用其中的任何一种。
在 MongoDB 中模型设计需要注意以下几点:
- 要根据具体的项目需求来选择合适的设计模式;
- 如果是要同时使用的数据,您可以将它们合并到一个文档中,否则可以选择将它们分成若干个文档;
- 可以有适当的数据冗余,因为与计算时间相比,磁盘空间更便宜;
- 针对最常用的用例优化您的模型;
- 写入时执行连接,而不是读取时执行连接;
- 在模式中执行复杂聚合。
嵌入式数据模型
嵌入式数据模型也称为非规范化数据模型,在该模型中您可以将所有相关的数据存储到一个文档中,例如我们在三个不同的文档中分别存储了一个员工的个人信息、联系方式和地址等信息,您还可以将这些信息整合到一个文档中,如下所示:
{
_id: ObjectId("601f4be6e646844cd045c8a4"),
Emp_ID: "10025AE336",
Personal_details:{
First_Name: "Radhika",
Last_Name: "Sharma",
Date_Of_Birth: "1995-09-26"
},
Contact: {
e-mail: "biancheng.net@gmail.com",
phone: "9848022338"
},
Address: {
city: "Hyderabad",
Area: "Madapur",
State: "Telangana"
}
}
规范化数据模型
在规范化数据模型中,您可以通过引用来将原始文档与子文档关联起来,例如您可以将上面的文档信息以规范化数据模型重写为以下几个文档:
Employee:
{
_id: ObjectId("601f4be6e646844cd045c8a4"),
Emp_ID: "10025AE336"
}
Personal_details:
{
_id: ObjectId("601f50bae646844cd045c8a5"),
empDocID: ObjectId("601f4be6e646844cd045c8a4"),
First_Name: "Radhika",
Last_Name: "Sharma",
Date_Of_Birth: "1995-09-26"
}
Contact:
{
_id: ObjectId("601f50bae646844cd045c8a6"),
empDocID: ObjectId("601f4be6e646844cd045c8a4"),
e-mail: "biancheng.net@gmail.com",
phone: "9848022338"
}
Address:
{
_id: ObjectId("601f50bae646844cd045c8a7"),
empDocID: ObjectId("601f4be6e646844cd045c8a4"),
city: "Hyderabad",
Area: "Madapur",
State: "Telangana"
}
【示例】假设我们需要为某个博客或网站进行数据库设计,网站的具体要求如下:
- 每个帖子都有唯一的标题、描述和网址;
- 每个帖子可以有一个或多个标签;
- 每个帖子都有其发布者的名字和喜欢的人数;
- 每个帖子都可以有零个或多个评论,评论中包括他们的名字、信息、数据、时间和喜好。
在使用关系型数据库来实现上述需求时至少需要创建三个表,如下图所示:
图:关系型数据库架构设计
若使用 MongoDB 来实现上述需求,可以使用一个集合来实现,其结构如下:
{
_id: POST_ID,
title: TITLE_OF_POST,
description: POST_DESCRIPTION,
by: POST_BY,
url: URL_OF_POST,
tags: [TAG1, TAG2, TAG3],
likes: TOTAL_LIKES,
comments: [
{
user:'COMMENT_BY',
message: TEXT,
dateCreated: DATE_TIME,
like: LIKES
},
{
user:'COMMENT_BY',
message: TEXT,
dateCreated: DATE_TIME,
like: LIKES
}
]
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2020-03-08 urllib登录的cookie复制到headers,模拟登录人人网
2020-03-08 urllib中的保存cookie使用,运用cookiejar来模拟登录人人网
2020-03-08 urllib中的cookie使用,四种方法
2020-03-08 urllib中的https使用,导入ssl模块
2020-03-08 urllib判断重定向
2020-03-08 urllib中的down,下载百度图片为例
2020-03-08 urllib中的本地代理设置