MongoDB数据模型

发布于:2025-07-27 ⋅ 阅读:(11) ⋅ 点赞:(0)

目录

数据模型基础

数据模型概念

数据模型元素

类比理解

模型设计三大步骤

三大范式

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倍以上,一般实时数据展现一般也是以小时进行展示的,所以也不影响数据查询操作


网站公告

今日签到

点亮在社区的每一天
去签到