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

2023-09-20 05:59:05

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

更多推荐

【送书活动】用“价值”的视角来看安全:《构建新型网络形态下的网络空间安全体系》

文章目录每日一句正能量前言本书概况赠书活动目录每日一句正能量成功与失败,幸福与不幸,在各自心里的定义都不会相同。前言过去,安全从未如此复杂;现在,安全从未如此重要;未来,安全更需如此洞擦。经过30多年的发展,安全已经深入到信息化的方方面面,形成了一个庞大的产业和复杂的理论、技术和产品体系。因此,需要站在网络空间的高度看

2023年五一杯数学建模A题无人机定点投放问题求解全过程论文及程序

2023年五一杯数学建模A题无人机定点投放问题原题再现:随着科学技术的不断发展,无人机在许多领域都有着广泛的应用。对于空中执行定点投放任务的无人机,其投放精度不仅依赖于无人机的操作技术,而且还与无人机执行任务时所处状态和环境有关,例如在接近投放点时无人机的高度、速度,无人机所处位置的风速、投放点周围地理环境等因素。在本

无人机+三维实景建模助力古建筑保护,传承历史记忆

历史文化建筑,承载着过去各个时代的文化记忆。无论是保存还是修缮古建筑,都需要将其基本信息进行数字化建档,为修缮提供精准参考。根据住建部的要求,从2020年开始到2022年,全国需完成历史建筑100%测绘及系统录入工作,并且明确鼓励采用摄影测量、三维激光等新技术来完成。古建筑实景三维建模与无人机技术的结合正在改变人们对历

MTBF、MTTR、MTTA 和 MTTF

了解一些最常见的事件指标在当今永不停机的世界中,中断和技术事件比以往任何时候都更加重要。故障和停机期间会带来现实后果,错过截止时间、付款逾期、项目延迟。这就是为什么公司必须量化和跟踪有关正常运行时间、停机期间以及团队解决问题的速度和有效性的指标。业界最常跟踪的一些指标包括MTBF(故障前平均时间)、MTTR(平均恢复、

【音视频播放器测试】确保卓越的媒体体验

😄作者简介:小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊座右铭:不想当开发的测试,不是一个好测试✌️。如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍文章目录摘要引言一、媒体格式兼容性测试二、流媒体播放测试三

C++,构造函数、拷贝构造函数、 常成员、常对象、static

一、构造方法构造方法的名字必须与类名同名它不具有任何返回值,也不能声明返回值类型,连void都不能写构造方法可以重载构造方法声明一般格式为类名(<形参列表>);定义构造方法格式为类名::类名(<形参列表>){.......}构造方法中的this指向新创建的对象.构造方法的功能是由用户定义的,用户根据初始化的要求设计方法

Kotlin协程CoroutineScope异步async取消cancel等待await的任务

Kotlin协程CoroutineScope异步async取消cancel等待await的任务importkotlinx.coroutines.*funmain(args:Array<String>){runBlocking{valmScope=CoroutineScope(Dispatchers.IO).async{

Batbot智慧能源管理云平台:拥抱数字化,提高能源效率!

我们拥抱数字化,以帮助提高能源效率。政府已采取措施增强国家的环境信誉,旨在实现雄心勃勃的法定目标,即到2035年,将国家温室气体排放量减少78%(与1990年相比)。拥抱数字化,提高能源效率!随着许多类似举措的顺利实施,建筑环境可能正面临着越来越大的减少碳足迹的压力。鉴于目前建筑物的碳排放量约占全球碳排放量的39%,并

并发编程——线程池

文章目录线程池介绍线程池核心属性核心方法execute方法addWorker添加工作线程runWorker执行任务getTask工作线程排队拿任务线程池介绍Java构建线程的方式newThreadnewRunnablenewCallable为了避免频繁创建和销毁线程造成不必要的性能,一般在使用线程时,会采用线程池。线程

什么是HTTP/2?它与HTTP/1.1相比有什么改进?

聚沙成塔·每天进步一点点⭐专栏简介⭐HTTP/2简介⭐主要的改进和特点⭐总结⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统

linux之perf(4)stat统计

Linux之perf(4)stat统计Author:OncedayDate:2023年9月16日漫漫长路,才刚刚开始…注:该文档内容采用了GPT4.0生成的回答,部分文本准确率可能存在问题。参考文档:Tutorial-PerfWiki(kernel.org)perf-stat(1)-Linuxmanualpage(ma

热文推荐