当前位置: 首页 > news >正文

MongoDB数据模型

目录

数据模型基础

数据模型概念

数据模型元素

类比理解

模型设计三大步骤

三大范式

MongDB数据模型

模型设计

建模步骤

基础设计

关系表达

套用方式

1对1

1对N

N对N

引用方式

1对1

1对N

N对N

模式套用(拓展)


数据模型基础

数据模型概念

是一组由符号、文本组成的集合,用于准确表达信息,达到有效交流沟通的目的

数据模型元素

实体、属性、关系

类比理解

实体   在MySQL中就是表、在MongoDB中就是集合

属性  在MySQL中就是表中的字段、在MongoDB中就是集合中的字段

关系  在MySQL中就是表与表之间的关系, 1对1、1对N、N对N  这个MongoDB也是类似的,后面介绍

模型设计三大步骤

概念模型    描述业务管理对象

逻辑模型     列出实体、属性和关系

物理模型     设计数据库

三大范式

1、确保每个字段是原子性

2、必须有主键

3、数据减少不必要的冗余

关系型数据库需要遵循三大范式如MySQL

非关系型数据库不受三大范式的约束如MongoDB

MongDB数据模型

模型设计

MongoDB是需要进行模型设计的

因为文档模型设计的无论模型和逻辑模型很类似

JSON文档模型通过内嵌数据或引用字段来表示关系

所以MongoDB进行模型设计只需要设计概念模型和逻辑模型

建模步骤

基础设计

根据概念模型推导出逻辑模型,确定集合、字段

列出实体之间的关系,1对1、1对N、N对N

拓展: 实体设计为多叉树的形式和链表形式,此时其实只需要在实体中维护父节点ID字段和子节点ID字段两个字段就可以轻松实现,只不过链表是一个父节点对应一个子节点。多叉树的是一个父节点对应多个子节点

关系表达

对MongoDB实体之间关系表达,优先使用套用方式.  当出现数据量大,文档超过16M  业务需要时候需要考虑使用分多个集合进行数据关联

套用方式

1对1

直接对JSON对象内嵌

内嵌后文档不超过16M

1对N

对JSON对象数组进行内嵌

内嵌后文档不超过16M

数组长度不确定

N对N

对冗余的JSON对象进行内嵌,允许重复

内嵌后文档不超过16M

数组长度不确定

引用方式

引用方式就是将数据分成多个集合进行数据关联,类比MySQL中的创建多张表进行关联查询

如果内嵌后的文档会超过16M,或者有分集合的条件,我们可以考虑把集合分开,变成两个集合

然后我们对这两个集合进行$lookup左连接查询也是可以的

MongoDB的复杂查询,还不熟悉的同志可以看我的文章

MongoDB复杂查询 聚合框架-CSDN博客

1对1

集合关系是1对1,在左表中加入一个右表的链接条件的字段,用于查询

1对N

集合关系是1对N,在左表中使用外键引用或者维护一个右表的id数组从而实现1对N

MongoDB不支持外键,如果需要确保数据的完整性,需要自己去维护

N对N

集合关系是N对N的情况下,要使用中间集合进行关系的维护,就是把多对多拆分为两个1对多,中间集合是多,另外两个集合是1,所以查询N对N集合的数据需要使用两次关联查询

当然,mongoDB也可以考虑,两个集合都是以关联数组做到对中间集合的替代,从而实现多对多

        如: 学生和课程是多对多   那么在学生集合中使用课程id数组作为关联   在课程集合中使用学生id数组作为关联也可以实现多对多的关系

模式套用(拓展)

因为文档模型是无范式、无思维模式、可以充分发挥想象力。所以在特定场景下MongoDB是有经典的设计模式的

如:在统计实时数据的时候,采集数据频繁、数据量太大,就可以使用分桶设计

分桶设计: 把数据先聚合在一起,在进行存储,减少数据的条数,压缩数据。我们进行实时数据采集的时候可以把分钟级别的数据,通过数组的形式聚合成一个小时一条数据存储,减少公共字段的内存占用,大幅度减少了索引的建立,节约内存达10倍以上,一般实时数据展现一般也是以小时进行展示的,所以也不影响数据查询操作

http://www.dtcms.com/a/298915.html

相关文章:

  • Zookeeper的简单了解
  • 学习嵌入式的第三十三天-数据结构-(2025.7.25)服务器/多客户端模型
  • Typecho插件开发:自定义注册用户组与免审发布功能实现
  • OTG原理讲解
  • 非定长滑动窗口(持续更新)
  • 【GoLang#3】:数据结构(切片 | map 映射)
  • 新手向:Git下载全攻略
  • 用Java实现rpc的逻辑和流程图和核心技术与难点分析
  • 图论:Dijkstra算法
  • 【WPF】NumericUpDown的用法
  • 01 01 01 第一部分 C++编程知识 C++入门 第一个C++程序
  • Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
  • HashMap(JDK1.7、JDK1.8)原理与结构分析与synchronizedMap()
  • Spring Boot SSE实战:SseEmitter实现多客户端事件广播与心跳保活
  • Spring Boot 实战:用 Apache Commons CSV 优雅解析 CSV 文件
  • x86汇编语言入门基础(三)汇编指令篇5 串操作
  • OpenCV学习探秘之一 :了解opencv技术及架构解析、数据结构与内存管理​等基础
  • 技术赋能与营销创新:开源链动2+1模式AI智能名片S2B2C商城小程序的流量转化路径研究
  • 嵌入式硬件篇---zigbee无线串口通信问题解决方法
  • Claude 4.0 终极编程指南:模型对比、API配置与IDE集成实战
  • CMakeLists.txt 怎么写
  • 39.Python 中 list.sort() 与 sorted() 的本质区别与最佳实践
  • 数据库索引详解:原理、设计原则与应用场景
  • NLua和C#交互
  • 6G通感算
  • Spring Boot DFS、HDFS、AI、PyOD、ECOD、Junit、嵌入式实战指南
  • 学习游戏制作记录(剑投掷技能)7.26
  • Kotlin 数据容器 - List 扩展(转换操作、过滤操作、排序操作、分组操作、集合操作、归纳操作、窗口操作)
  • 一款基于react-native harmonyOS 封装的【文档】文件预览查看开源库(基于Harmony 原生文件预览服务进行封装)
  • 【深度之眼机器学习笔记】04-01-决策树简介、熵,04-02-条件熵及计算举例,04-03-信息增益、ID3算法