MongoDB数据模型设计_mongodb数据库物理设计-程序员宅基地

技术标签: MongoDB  mongodb  

MongoDB高手课_MongoDB_NoSQL-极客时间极客时间推出的MongoDB高手课是帮助互联网从业者学习MongoDB、NoSQL的在线课程,极客时间是面向IT领域的知识服务产品,致力于帮助用户轻松学习,高效学习。https://time.geekbang.org/course/intro/100040001?tab=catalog

一. 传统模型设计

 1. 数据模型设计三要素:实体(Entity),属性(Attribute),关系(Relationship)

2. 传统模型设计流程(模型逐步细化的过程):概念模型==>逻辑模型==>物理模型

        关系模型常用的第三范式原则:数据在库中尽量不存在冗余,指表中的所有数据元素要能唯一地被主关键字所标识,它们之间必须相互独立,不存在其他的函数关系。


二. JSON文档模型设计

1. 文档模型和关系模型的区别

  • 文档模型设计:属于物理模型(PDM)设计阶段,但其实文档模型设计的物理模型和逻辑模型相似,可以省略物理建模的具体过程。
  • 文档模型设计vs关系模型设计区别:文档模型设计不遵从第三范式,允许冗余。
  • 文档模型设计原则:性能(performance)、开发易用(ease of development)。
  • 文档模型vs关系模型:

 2. MongoDB文档模型设计三部曲

文档模型设计示例见如下文章:

《MongoDB高手课》学习记录(第十四天) - SegmentFault 思否今天要学习的是14、15、16、17章节。对比传统的模型设计方法,作者总结自己的经验,来讲解MongoDB是怎么样进行模型设计的,并举了一个分桶模型的例子。https://segmentfault.com/a/1190000021459458?utm_source=sf-similar-article

(1)基础建模

        找到对象(实体)==> 明确关系(实体之间的关系及基数)==> 进行建模(基于关系建模原则确定内嵌方式)==> 完成基础模型构建

关系建模原则【以内嵌为主】:

  • 1-1:以内嵌为主,作为子文档或者直接在顶级,不涉及数据冗余。
    • 例外:内嵌后文档大小超过16MB。
  • 1-N:以内嵌为主,用数组表示一对多,不涉及数据冗余。
    • 例外:内嵌后文档大小超过16MB or 数组长度太大 or 数组长度不确定。
  • N-N:无需映射表,以内嵌为主,用数组表示一对多,用冗余实现多对多。
    • 例外:内嵌后文档大小超过16MB or 数组长度太大 or 数组长度不确定。

(2)工况细化

基于内嵌的文档模型,根据实际使用场景的技术需求:

  • 使用冗余优化访问性能
  • 使用引用解决性能瓶颈
    • 引用:类似关系模型设计,用id或唯一键关联,用 $lookup 一次查询多表。
    • 使用场景:内嵌后文档大小超过16MB or 内嵌文档或数组元素需频繁修改 or 数组长度太大 or 数组长度不确定。
    • 引用设计限制:(1)MongoDB对使用引用的集合之间无主外键检查;(2)$lookup 只支持left outer join,且关联目标(from)不能是分片表。

引用案例: 

引用模式下的关联查询:

# 使用$lookup对两个表进行关联查询
# 本地表contacts的group_ids字段和目标表groups的group_id字段一对一对应
db.contacts.aggregate([
    {
        $lookup:{
            from:"groups",              //指明哪个是目标表
            localField:"group_ids",     //本地表取哪个字段
            foreignField:"group_id',    //目标表取哪个字段
            as:"groups"                 //拿回来之后放到groups这个新字段名中
       }
    }     
])

(3)套用设计模式

  • 设计模式:经过实战的优秀设计技巧,可以解决很多常见问题,提升数据读写效率,降低资源需求。
  • 文档模型无范式、无思维定式,可以充分发挥开发者的想象力,与设计模式相结合可以事半功倍。

MongoDB常见设计模式

【例1】列转行设计模式:

 【例2】文档版本设计模式:

【例3】近似字段设计模式: increment by

 【例4】预聚合设计模式: 

【例5】分桶设计模式:

参考文章:

《MongoDB高手课》学习记录(第十五天) - SegmentFault 思否以存储电影信息的文档为例,因为各个国家的首映时间不同,我们的最简单的想法可能为了统计方便,会每增加一个上映地点,就增加一个统计字段,然后再给这个字段建一个索引。这样统计查询的速度是快了,但是系统写入的效率却下降了。那么怎么解决这个问题呢?采用内嵌数组的方式来组织数据,减少字段数量。然后通过建立内...https://segmentfault.com/a/1190000021471814?utm_source=sf-similar-article

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SongD1114/article/details/124234147

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法