MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模

news2025/2/25 12:02:23

7749f025aeb79b10eac11b9235e99f54.png

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1300人左右 1 + 2 + 3 + 4) 3群即将突破 400 (目前383)会关闭自由申请,新人会进4群,另欢迎 OpenGauss 的技术人员加入。

每日感悟

我们都在追求真理,追求自由,追求公平,问题是我们都在希望别人能成为,我们理想中的人,唯独忘记了自己才是那个最刺耳的噪音。

8af47cb37456acaf8819d13e69a7cf53.png

2023年度的纽约的MongoDB local 的大会对于MongoDB的发展和当前的一些问题进行了分享,从本期会找一些有意思的话题来进行翻译。基于某些原因,可能翻译中由于能力的问题,翻译有语病或不通顺的情况,请见谅。(音译)

正文

在开始我的介绍前,我想讲一个事情,在我们工作中,一个人有多少电话的问题但是现在呢,我们有多少联系的方式。上帝知道我们下个月,有多少新的联系方式 ZOOM ID , SKAPE ID, ........

ac1291e8240a73c6bf037821e4097fa7.png

17fd10c2bfd6470c49b3fa408e9025a0.png

而我还使用传统的数据库来设计存储这些信息,如下面的方式二维表格,在多年前这个设计还好,我可以加一列,来记录新的联系方式,但现在我需要加多少列,才能完成这个工作。

fe0c897d6f36ad1423a4e59738fe6412.png

这就是我今天的Show 要和大家讨论,如何避免这样的问题与数据库建模的问题。我是 Daniel Coupal, 相信大家可以从我的博客上了解到我关于数据建模的信息和我为一些的大学开设的数据建模的课程。

ca8538d410fa84bf6eb9f24a1ec64b86.png

今天我们有3个议题, NOSQL数据库是否需要建模,用什么技术来在MongoDB上建模,同时我们如何解决我们在使用MongoDB时遇到的一些建模的问题。

在我论述这个问题的前我想述说约束或限制的问题,(这块的内容与实际要论述的无关,所以跳过,这段主要讲授的,你在使用一个产品的时候,要深知这个产品可以提供的功能)

57c64d5d147b4fb6159d7846fec42d9a.png

比如你是否熟悉关于MongoDB对于字段的加密的问题,MongoDB可以针对key:value 进行加密。

7b6703c5838549e6e18c66b7c0f6c112.png

在展开我们的话题前,我还有一件事,需要说明,我们在讲解建模时需要一个案例,我们以互联网的一个有关作者和读者以及文章之间的一个模型作为讲解的对象。

4c566fb697772284120337778f1fec9f.png

在现实中,一个人写了很多的文章,一个文件有很多的评论,然后这些事情有很多的标签。但是如果我让你们来做建模这件事,可能很多人会把上面的这张图画出来,但如果到了MongoDB 则这个问题就变得复杂了,这里可以有多种建模的方式,比如第一种我们把所有的信息都放到一个collection,把所有的信息都嵌入到其中(参加下图),当然有人会说,你这样就有重复的有关于人员的信息了, 那么我们只对人员一次进行更新信息,所以我们采用第二种方案,提取所有的用户信息,然后和文章信息进行关联,那么到底那种方案是最好的。实际上这是关于你管理数据的方式问题是否能进行有效的数据更新的问题,这里如果能进行良好的数据更新,则第一个方案是更好,你只需要执行一次检索,可以获得更好的性能,但如果数据更新是一个管理的问题的话,那么第二个方案更好。

9f0e119ca5877de9c170291ff11bdcea.png

所以我们得出一个结论,如果要获得方案,首先你需要了解你的工作负载,才能更好的进行建模设计。

31e46bc9d6016ee8d22203a285a8b744.png

通过这个问题我们导入我们的今天要说的第二个部分,通过什么方法你能了解在获得你的工作负载后,进行正确的在MongoDB 中进行建模设计。

23727434973cb76d8cb245d3317b5f1d.png

所以对于MongoDB的模式设计,首先要了解工作负载,然后是之间的关系,最后产生设计模式,最终进行建模。这里传统的设计中可能会引入建模架构师,然后互相讨论数据模型之间的关系,定义等等,然后去咖啡间喝杯咖啡,MongoDB 不同他是NOSQL,他不需要去详细的画出ER图,他非常简单,了解工作负载,然后直接进行设计。

f61e1a510f0a99939afa2f3d503c6a2b.png

工作负载的了解中包含了,你的数据尺寸的问题,你需要每秒操作多少次,如何进行查询,你的硬件是怎样的,想花多少费用,等等这些都是你工作负载信息中,可以了解并对你设计一个靠谱的建模有帮助的。

9347d3237b91889da1785615e2e07b87.png

下面我们举一个例子,这里我们通过分析一个网站关于文章相关的数据处理来分级进行数据负载方面的分析。关于数据的吸入,我们可以看到,文章本身并不是一个高频写入的部分,而读者的comments 写入的频率明显要高于文章。从读取文件和分析读者对于文章的评估这部分来说,读取文章是一个高频的操作。但没有文章就没有我们的网站和后续的一切,所以这个部分是high, 他对我们来说太重要了。

2b28385cf674cd05f599f808e0142e95.png

所以这里对于我们这个项目来说,快速加载文章来说这是我们首要的工作,这里我们列出一个list ,对于我们认为重要的东西,我们需要更深层次的挖掘对我们建模有用的信息。另外还有一些信息,比如如果你和金融机构进行合作,某些约束你要了解,比如你希望你的数据保留2-3年,而实际上他们要去你要保留更长的时间10年,这样的情况下你要对数据的存储的部分也有清晰的认知。

3c7c33a7c33d0a776db2cd7d35bce782.png

e17b49f359f4627875cc0d328f89704e.png

下面我们到了第二个部分,在你对于基础的信息都了解后,你需要来定义关系,比如1 VS 1 , 1 VS N , N VS N,在设计时,你还需要考虑更多,比如类似推特,如果一个人有100万粉丝,你是不会想把这100人嵌入到这个人的document,所以这里我们可以把你需要的数据最小化处理的方式找到你应该使用的设计模式。

8f45b52d2bbd3b2e4dafd3368980ae2b.png

下面我们需要考虑的是,你是否需要嵌入的方式将这些信息放到我们的建模中,我们举例,如果我把我的车停到我的车库,如果是传统数据库,则我第二天要开车,就需要打开车库,把车辆的每个零件都找到,然后组装后,开出去(意思是获得数据还需要进行多个表的JOIN)。如果是MongoDB 我打开车库,里面就放了一辆车。

8e8e35a7c88ab13df6d6312b3694d7dd.png

这里我们总结一下 ,如果我们想要应用程序访问数据,最好的方式是把他们放到一起。

a6f3bac88a2cbefc473c9684bbcf5e04.png

同时关系型数据库为什么也反感 reference ,也是因为访问的成本高的原因,使用嵌入的方式避免的关联查询的问题。这里需要说明,MongoDB是讲一个实体放入到另一个实体,如果是这样的情况下如果你的一个实体非常的小,可以用数组的方式来进行嵌入的处理。66dcf756ce0e2d35c695aafe3778b4bd.png

所以我们的问题是到底我们在模式设计中使用嵌入,还是,引用。我们还说刚才说的推特的问题,我们有两个体量非常大的数据,这里我们不能用嵌套的方案,N VS N ,这里我们两个比较大的实体之间,使用引用的方式,这里MongoDB 支持事务,所以这个问题很好被解决。

但这里我们需要说明的是,在两个大对象进行引用的情况下,你的内存会驻留很多引用的信息,但是使用者不要忘记MongoDB的初衷是什么,在读取一次,提供更高的效率。另从归档的角度来说,一些数据的归档,在传统数据库是一个灾难,你需要把相关的表都链接起来进行完整的数据归档,而在MongoDB 他在一个collection中。

同时你的代码也很简单,没有转换读取,从数据库中转换数据库,在进行存储的问题。

40d61695ddb992d2c0d3ae0b36116d9a.png

28556a229e5ae302a027b44035c36f93.png

在设计中MongoDB 都提供了灵活性,嵌套,数组,链接,灵活的方式,这里我写了一本数据关于如何进行建模的设计。

4dc88e4e02f17f6e5e3216b2db069ef2.png

这个部分的处理里面我们还可以通过分析,比如我们对于文章阅读中,对于文章的作者感兴趣,那么我们可以仅仅在articles中显示作者的名字,如果想要了解更详细的信息可以通过链接的方式,在程序中访问people这个collection来解决问题。

同时针对于comments 的处理,我们还可以通过逻辑分析来进行处理, 一个文章可能有1000多个评论,但实际上大多数人不会将1000多个评论都访问,所以我们只需要在articles 中设置一个子集,存储最后10条的评论,如果要看所有的评论可以直接访问comments collection。这样做的原因都是为了性能。

d3d73edf64a06d1b824e1712bbafdfb7.png

说到这里我们要进入下一个话题,evolving the model with the schema versioning .

在你成功的设计出一套建模后,并运行一段时间后,你会在应用和数据处理模式数据量变化的情况下,改变现有的建模。

80eea8d3a76dbf33b3cc9710a03233eb.png

63df1a4446a7654c675da1d33a8a0feb.png

在传统数据库中,默认的我们会添加字段,或者改变表和表之间的关系

下图我们有两个模式的版本,第二个版本我们建立了链接模式,

01036ff2ab75b6db97b8ac867ef8a3b6.png

016eceb413f7ea4da6648ed7849bbe49.png

我们在周五进行部署,周一进行切换从原有的模式到新的模式中,这里包含的数据的迁移,应用的重新设计和改变,更新好数据,然后停机,进行切换。

如果这个事情换到MongoDB,我们仅仅需要在原有的文档中加入版本号,这里一个collection 有文档的多态规范,也就是一个集合中存在两个版本的数据,我们可以让每个文档都有自己的版本

还是这件事,我们在使用了MongoDB后,根本不需要停机,我们只需要更改应用程序让他可以读取版本2的数据和处理版本2模式的数据,同时还兼容版本1的数据,数据迁移和应用的使用是动态的切换。

1faab7cc9d833bd9008ed02bea16f6cd.png

1a16c84fe46fbad1ac0c1d36ac02e822.png

此处省略,对上述的部分的重复和总结以及对Mongodb的大加赞扬 !

8587f9d95d1bb387adc9c4c01dea7cbe.png

然后推荐了一本关于模式设计的书。

总结,整体里面还是介绍,并且是一些老的概念,但对于初学者来说,足够改变对于数据库模式设计的看法和思路。

cdaf6e433369af7c43cfc08f460cfbc9.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1027623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【校招VIP】前端JS语言之CSS基础属性

考点介绍 CSS全称为Cascading Style Sheets,中文翻译为“层叠样式表”,简称CSS样式表,所以称之为层叠样式表(Cascading Stylesheet)简称CSS。在网页制作时采用CSS技术,可以有效地对页面的布局、字体、颜色、…

MyBatis 篇

目录 1、什么是MyBatis 2、说说MyBatis的优点和缺点 3、#{}和${}的区别是什么? 4、当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 5、Mybatis是如何进行分页的?分页插件的原理是什么? 6、Mybatis是否支…

MLAgents (0) Unity 安装及运行

1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…

【C++杂货铺】国庆中秋特辑——多态由浅入深详细总结

文章目录 一、多态的概念二、多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 虚函数重写的两个例外2.4.1 协变(基类与派生类虚函数返回值类型不同)2.4.2 析构函数的重写(基类与派生类析构函数的名字不同) 2.5 …

【Java核心】JDK、JRE、 JVM的联系与区别

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ JDK、JRE、 JVM的联系与区别 1. 简述2. 是什么…

Linux查看系统信息

# 查看操作系统的详细信息 uname -a# 查看已安装的Linux发行版信息 cat /etc/os-release# 查看Linux Standard Base (LSB)的信息 lsb_release -a# 查看主机的信息 hostnamectl# 查看文件系统的磁盘空间使用情况 df -h# 查看系统内存的使用情况 free -h# 查看网络接口的信息 ifc…

【LeetCode75】第六十题 使用最小花费爬楼梯

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个数组,第i个数表示在第i个台阶起步所需的花费。我们可以从下标为0或是1的台阶出发,问我们最终到达顶…

【校招VIP】测试脚本语言之权限命令

考点介绍: 在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的http://COMMAND.COM和后来的cmd.exe…

nginx配置gzip压缩,优化传输效率,加快页面访问速度

文章目录 引言一、什么是nginx的gzip二、nginx的常用配置项三、使用示例四、浏览器查看gzip是否生效1. 判断浏览器是否支持gzip2. 判断gzip是否生效 总结 引言 在现代互联网的高速发展进程中,网站的访问速度愈发成为了用户选择和留存的关键。其中,通过g…

【方案】浅析AI视频分析与视频监控技术的工厂车间智能化监管方案

一、方案背景 工厂生产车间一般是从原材料到成品的流水作业,有大量器械和物料。为保障车间财产安全并提高生产效率,需要进行全面的监管。在生产制造流水线的关键工序中,不仅有作业过程监管需求,同时,也存在生产发生异…

SpringBoot-JWT生成

一、理论 1.配置pom.xml <!-- JWT令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency> 2.加密方式 说明:官网JSON Web Tokens - jwt…

vim的使用介绍以及命令大全(系统性学习day3)

懒羊羊感谢大家的关注和三连支持~ 目录 前言 一、vim的使用介绍 二、命令大全 1.命令模式 &#xff08;1&#xff09;复制&#xff08;配合粘贴命令p使用&#xff09; &#xff08;2&#xff09;剪切 &#xff08;3&#xff09;粘贴 &#xff08;4&#xff09;删除 …

IDM激活

激活脚本原地址 github搜索&#xff1a;IDM-Activation-Script 或者直接点我进入 如何激活&#xff1f; 下载IDM 官网链接&#xff1a;Internet Download Manager: The fastest download accelerator 然后安装 安装成功后进入powershell win x 执行命令 iwr -useb https:/…

企业蓄电池怎么实时监测?这个方法最简单使用!

在这个数字时代&#xff0c;企业对电力的依赖性愈发显著&#xff0c;这使得电池系统成为维持业务连续性的不可或缺的一环。 蓄电池监控不仅有助于实时跟踪电池系统的性能和状态&#xff0c;还有助于预测问题&#xff0c;提前采取措施以防止电力中断。它还可以帮助企业降低能源成…

2023年9月21日,历史上的今天大事件早读

​公元前19年9月21日古罗马诗人维吉尔逝世 1069年9月21日宋神宗采用王安石新法&#xff0c;开始实行青苗法 1643年9月21日皇太极逝世 1898年9月21日慈禧太后发动戊戌政变 1909年9月21日我国飞机设计师冯如第一次试飞成功 1920年9月21日民主革命家朱执信遇难 1926年9月21日…

c++ 函数的参数是否可以为auto

&#xff08;1&#xff09;在vs2019开到 cpp20 的语法规范&#xff0c;是可以的 &#xff08;2&#xff09;但网上和文心一言和书上说不可以 (2) 再附上一种auto 的很炫酷的写法&#xff1a;

面试Java后端

sql 五表联合查询 面试八股 JDK&#xff0c;JRE,JVM之间的区别 JDK&#xff0c;Java标准开发包&#xff0c;它提供了编译、运行Java程序所需的各种工具和资源&#xff0c;包括Java编译器、Java运行时环境&#xff0c;以及常用的Java类库等。 JRE(Java Runtime Environment)&…

label_studio中uwsgi内存占用高的问题排查

问题描述 使用docker起的label_studio服务&#xff0c;起来就占了8GB内存&#xff0c;无论是否有标注任务。 而且这个么大内存label_studio起来就有&#xff0c;不是随着时间起来的。本来发现问题的是label_stuido17.3, 我下载了18.02版本的docker&#xff0c;问题也是一样的,…

视频监控系统/安防监控/视频AI智能分析网关:持刀检测算法场景汇总

TSINGSEE青犀AI智能分析网关——持刀检测算法&#xff0c;是一种利用计算机AI分析算法技术来检测和辨别视频中是否存在刀具的算法&#xff0c;用来保障群众安全&#xff0c;维护公共治安&#xff0c;还可以与“人员跌倒”、“人员聚集”、“人员跌倒”等算法结合&#xff0c;制…

inpaint-anything:分割任何东西遇到图像修复

用户可以通过单击图像中的任何对象来选择它。借助强大的视觉模型&#xff0c;例如SAM&#xff0c;LaMa和稳定扩散&#xff08;SD&#xff09;&#xff0c;Inpaint Anything能够顺利地删除对象&#xff08;即删除任何内容&#xff09;。 此外&#xff0c;在用户输入文本的提示下…