『MongoDB』MongoDB模型设计的成神之路

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 📣读完这篇文章里你能收获到- 为什么很多人认为MongoDB是无模式?- 文档模型跟传统的关系模型有什么区别?- 关于MongoDB的模型设计模式,你知道几个?- MongoDB如何进行表关联?- 文档模型的设计规范及设计原则- 文档建模模型设计三部曲- 1-1关系建模,1-N关系建模,N-N关系建模的建议- 针对不同的场景提供丰富的设计案例分享

请添加图片描述
📣读完这篇文章里你能收获到

  • 为什么很多人认为MongoDB是无模式?
  • 文档模型跟传统的关系模型有什么区别?
  • 关于MongoDB的模型设计模式,你知道几个?
  • MongoDB如何进行表关联?
  • 文档模型的设计规范及设计原则
  • 文档建模模型设计三部曲
  • 1-1关系建模,1-N关系建模,N-N关系建模的建议
  • 针对不同的场景提供丰富的设计案例分享

一、JSON 文档模型设计特点

1 为什么人们都说 MongoDB 是无模式?

  • 严格来说,MongoDB 同样需要概念/逻辑建模
  • 文档模型设计的物理层结构可以和逻辑层类似
  • MongoDB 无模式由来:可以省略物理建模的具体过程

在这里插入图片描述

2 文档模型与关系模型有什么区别?

关系数据库 JSON 文档模型
模型设计层次 概念模型、逻辑模型、物理模型 概念模型、逻辑模型
模型实体 集合
模型属性 字段
模型关系 关联关系,主外键 内嵌数组,引用字段

3 MongoDB 文档模型设计的三个误区(下述说法均为错误!)

  • 1: 不需要模型设计
  • 2:MongoDB 应该用一个超级大文档来组织所有数据
  • 3:MongoDB 不支持关联或者事务

4 JSON 文档模型的设计规范

  • 文档模型设计处于是物理模型设计阶段 (PDM
  • JSON 文档模型通过内嵌数组引用字段来表示关系
  • 文档模型设计不遵从第三范式,允许冗余

在这里插入图片描述

5 JSON 文档模型的设计原则

  • 性能
  • 易用

请添加图片描述

二、MongoDB 文档模型设计三步曲

在这里插入图片描述
请添加图片描述

三、入门!基础模型的快速设计

1 建立基础文档模型

  • 根据概念模型或者业务需求推导出逻辑模型 – 找到对象
  • 列出实体之间的关系(及基数) - 明确关系
  • 套用逻辑设计原则来决定内嵌方式 – 进行建模
  • 完成基础模型构建

在这里插入图片描述

2 实例:联系人管理应用

  1. 找到对象

Contacts
Groups
Address
Portraits

  1. 明确关系

一个联系人有一个头像 (1-1)
一个联系人可以有多个地址(1-N )
一个联系人可以属于多个组,一个组可以有多个联系人 (N – N)

在这里插入图片描述

1-1 关系建模

在这里插入图片描述

1-N 关系建模

在这里插入图片描述

N-N 关系建模

在这里插入图片描述

3 基础建模小结

  • 1:9 规则: 大部分时候你会使用内嵌来表示 1-1,1-N,N-N
  • 内嵌类似于预先聚合(关联)
  • 内嵌后对读操作通常有优势(减少关联)

请添加图片描述

四、进阶!基础模型的需求细化

  • 基于内嵌的文档模型根据业务需求,使用引用来避免性能瓶颈使用冗余来优化访问性能

在这里插入图片描述

1 联系人分组需求遭遇瓶颈

  1. 用于客户营销
  2. 有千万级联系人
  3. 需要频繁变动分组(group)的信息,如增加分组及修改名称及描述以及营销状态
  4. 一个分组可以有百万级联系人

在这里插入图片描述

2 针对瓶颈设计解决方案

  • Group 使用单独的集合
  • 类似于关系型设计
  • 用 id 或者唯一键关联
  • 使用 $lookup 来提供一次查询多表的能力(类似关联)

在这里插入图片描述

3 引用模式下的关联查询

在这里插入图片描述

  • 查询时使用aggregate结合$lookup进行联表查询
db.contacts.aggregate([
    {
        $lookup:
        {
            from: "groups",  
            localField: "group_ids", 
            foreignField: "group_id", 
            as: "groups"
        }
    }
])

请添加图片描述

4 什么时候该使用引用方式?

  • 内嵌文档太大,数 MB 或者超过 16MB
  • 内嵌文档或数组元素会频繁修改
  • 内嵌数组元素会持续增长并且没有封顶

5 MongoDB 引用设计的限制

  • MongoDB 对使用引用的集合之间并无主外键检查
  • MongoDB 使用聚合框架的 $lookup 来模仿关联查询
  • $lookup 只支持 left outer join
  • $lookup 的关联目标(from)不能是分片表

请添加图片描述

五、成神!MongoDB设计模式案例分享

  • 文档模型:无范式、无思维定式、充分发挥想象力
  • 设计模式:实战过屡试不爽的设计技巧,快速套用

在这里插入图片描述

1 分桶模式

  • 背景:数据量大,有规律的分布(如按时间),数据颗粒度小
  • 场景描述

    • 物联网场景下的海量数据处理 – 飞机监控数据
    • 10万架飞机,1年的数据,每架飞机每分钟记录一条

在这里插入图片描述

分析:100000 365 24 * 60 = 52.6B数据量,数据大小大概4000GB,索引大小大概6000GB,一年下来的数据量极其庞大
  • 解决方案:分桶设计

在这里插入图片描述

分析:由原先模型中的events的对象更改为events数组,每个文档存储60个events也就是一个小时的数据,那么数据量由52.6B降至876M,索引大小由6000GB降至100GB,数据大小由4000GB降至600GB,不管是索引还是数据量都有了质的减少
  • 模式小结:分桶
场景 痛点 设计模式方案及优点
时序数据,物联网,智慧城市,智慧交通 数据点采集频繁,数据量太多 利用文档内嵌数组,将一个时间段的数据聚合到一个文档里。大量减少文档数量,大量减少索引占用空间

2 列转行模式

  • 背景:大文档,很多字段,很多索引
  • 场景描述

    • 有很多部电影
    • 需要记录每部电影各自在各个国家的最新上映时间
  • 原来的数据格式及原来的索引设计

在这里插入图片描述

分析:由于需要根据国家去查询电影的上映日期,因此需要设计大量的国家索引
  • 解决方案:列转行

在这里插入图片描述

  • 索引:db.movies.createIndex({“releases.country”:1, “releases.date”:1})
分析:将国家及日期提取为数组形式,只需要创建一个索引即可
  • 模式小结:列转行
场景 痛点 设计模式方案及优点
多语言(多国家)属性、产品属性 ‘color’, ‘size’ ... 文档中有很多类似的字段,会用于组合查询搜索,需要见很多索引 转化为数组,一个索引解决所有查询问题

3 版本管理模式

  • 背景:模型灵活了,如何管理文档不同版本?
  • 场景描述

    • 有很多个版本,每个版本的字段都有区别
    • 查询某个版本或者某个版本的数据以及对这部分数据作统一处理
  • 原来的数据格式

在这里插入图片描述

分析:由于不同的版本导致MongoDB的collection模型差异过大,容易导致数据的管理失控
  • 解决方案: 增加一个版本字段

在这里插入图片描述

分析:增加版本字段,可以明确的知道哪部分数据是哪个版本产生的
  • 模式小结:版本管理
场景 痛点 设计模式方案及优点
任何有版本衍变的数据库 文档模型格式多,无法知道其合理性,升级时候需要更新太多文档 增加一个版本号字段,快速过滤掉不需要升级的文档,升级时候对不同版本的文档做不同的处理

4 近似计算模式

  • 背景:需要统计大量的不重要数据
  • 场景描述

    • 统计网页点击流量
    • 每访问一个页面都会产生一次数据库计数更新操作
    • 统计数字准确性并不十分重要

在这里插入图片描述

分析:由于点击所需要更新的数据过于频繁,对数据库的写操作造成较大的压力
  • 解决方案: 用近似计算,每个10(X)次写一次 Increment by 10(X)

在这里插入图片描述

分析:数据近似,数据库的写入压力得以缓解
  • 模式小结:近似计算
场景 痛点 设计模式方案及优点
网页计数,各种结果不需要准确的排名 写入太频繁,消耗系统资源 间隔写入,每隔10次或者100次大量减少写入需求

5 预聚合模式

  • 背景:各种需要精确统计的场景
  • 场景描述

    • 热销榜:某个商品今天卖了多少,这个星期卖了多少,这个月卖了多少?
    • 电影排行:观影者,场次统计传统解决方案:通过聚合计算
分析:消耗资源多,聚合计算时间长
  • 解决方案: 用预聚合字段

在这里插入图片描述

分析:模型中直接加入聚合字段,聚合查询速度得以保障
  • 模式小结:预聚合
场景 痛点 设计模式方案及优点
准确排名,排行榜 统计计算耗时,计算时间长 模型中直接增加统计字段,每次更新数据时候同时更新统计值
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2天前
|
存储 NoSQL 数据管理
【MongoDB 专栏】MongoDB 文档模型详解
【5月更文挑战第10天】MongoDB 是一种流行的 NoSQL 数据库,以其灵活的文档数据模型著称。文章介绍了文档的基本概念、结构及操作,包括插入、查询、更新和删除。文档特点是灵活且可扩展,适合存储不同结构的数据。优势在于简化数据建模、提升开发效率并适应动态数据。应用场景包括用户信息、日志记录和电商数据管理。但需注意数据一致性和文档大小对性能的影响。理解文档模型有助于高效利用 MongoDB。
【MongoDB 专栏】MongoDB 文档模型详解
|
NoSQL 架构师 数据建模
干货教程 | MongoDB 熟练到精通(一):模型设计基础知识详解
本文为《MongoDB 熟练到精通》系列文章第一弹。该系列内容主要面向开发者,介绍在系统上线之前需要关注的事项,包括如何进行最关键的文档模型设计、读写事务操作,介绍数据安全和事务性等诸多高级参数和特性的含义及使用方式,以及开发者最佳实践。在最基本的数据库增删改查之余,我们更希望通过这部分的学习,让大家有足够的底气把简历上的“熟练使用 MongoDB 进行开发”,改为“精通使用 MongoDB 开发”。下面就让我们一起开启今日份的学习吧。
|
存储 NoSQL 安全
MongoDB 一致性模型设计与实现
本文源自阅读了 MongoDB 于 VLDB 19 上发表的 [Tunable Consistency in MongoDB](http://www.vldb.org/pvldb/vol12/p2071-schultz.pdf) 论文之后,在内部所做的分享(分享 PPT 见文末)。现在把分享的内容整理成此文,并且补充了部分在之前的分享中略过的细节,以及在分享中没有提及的 MongoDB Causa
984 0
MongoDB 一致性模型设计与实现
|
1月前
|
存储 NoSQL MongoDB
MongoDB如何创建数据库
MongoDB如何创建数据库
|
2天前
|
存储 NoSQL 关系型数据库
【MongoDB 专栏】MongoDB 与传统关系型数据库的比较
【5月更文挑战第10天】本文对比了MongoDB与传统关系型数据库在数据模型、存储结构、扩展性、性能、事务支持、数据一致性和适用场景等方面的差异。MongoDB以其灵活的文档模型、优秀的扩展性和高性能在处理非结构化数据和高并发场景中脱颖而出,而关系型数据库则在事务处理和强一致性上更具优势。两者各有适用场景,选择应根据实际需求来定。随着技术发展,两者正相互融合,共同构建更丰富的数据库生态。
【MongoDB 专栏】MongoDB 与传统关系型数据库的比较
|
5天前
|
存储 NoSQL 关系型数据库
MongoDB非关系型数据库实战
【5月更文挑战第6天】MongoDB,流行的NoSQL数据库,以其灵活的数据模型和高性能备受青睐。本文介绍了MongoDB的基础,包括文档型数据库特性、安装配置、数据操作。通过电商订单管理的实战案例,展示了MongoDB在处理复杂数据结构和大规模数据时的优势,适用于电商、游戏、视频直播等场景。MongoDB的索引、全文搜索和地理空间功能进一步增强了其实用性。注意性能优化和扩展性以确保系统稳定性和可靠性。
|
12天前
|
弹性计算 NoSQL Shell
一键安装 MongoDB 数据库脚本
【4月更文挑战第29天】
16 4
|
18天前
|
NoSQL MongoDB 数据库
MongoDB数据恢复—MongoDB数据库文件被破坏的数据恢复案例
服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分区进行了格式化操作,然后将数据库文件拷回原分区,重新启动MongoDB服务,服务无法启动。
|
22天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
311 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答