作者:陌北有棵树,Java人,架构师社区合伙人!


本月初,macOS 平台的开源包管理系统 Homebrew 宣布 Homebrew-core 将移除 MongoDB 的支持 (详见:https://github.com/Homebrew/homebrew-core/pull/43770)。

虽然事件的起因是MongoDB修改了开源协议,MongoDB 去年 10 月份宣布将开源 License 从 GNU AGPLv3 切换到 Server Side Public License(SSPL),SSPL协议要求,使用该协议提供的软件服务的厂商,必须同样开源使用该服务的程序,这样做的目的在于希望各厂商使用MongoDB 的商业云产品。

但后续的发展似乎并未按照预期:Linux 发行版 Debian和 Fedora 决定不使用 SSPL 协议下的软件。2019 年 1 月中旬,红帽宣布弃用MongoDB。再加上最近的 Homebrew,MongoDB似乎被推上了风口浪尖。

但作为技术人员,这些并不是我们需要过度关注的, 但可以从中引发一些思考。

回顾数据模型发展历史

近年来,随着NoSQL概念的兴起,再次引发了一轮如何最佳表示数据关系的争论。

然而当我们追溯到最早的数据库系统,回顾数据模型的发展历史,可能会发现,事物的发展像是一个环。

层次模型

数据库最初的设计模型是层次模型,比较典型的是IBM的信息管理系统(IMS),与目前的文档模型的JSON结构有很多相似的地方,可以很好的支持一对多的关系,但如果存在多对多的关系,解决方式就只能手动解析记录间的引用。

网络模型

为了解决这种局限性,后续提出了两种解决方案,一种演化成了目前的关系模型,还有一种叫做网络模型。网络模型将层次模型中每个记录只能有一个父节点的限制取消,一条记录可以有多个父节点,连接各种网络模型的,可以类比于指针,访问方式就像链表遍历一样,找到对应的路径,这种方式无论对于查询还是查找,都存在着极大的困难。

关系模型

在这种情况下,关系模型显得更胜一筹,相比之下,不再有复杂的嵌套查询逻辑和复杂的访问路径,用外键来对不同的关系(表)进行连接,方便的支持任意条件的查询,还可以添加索引以支持查询优化,除了索引,关系型数据库还可以通过查询优化器,来选择最合适的索引以提高查询速度。

文档模型

随着业务复杂性的提升,程序员们又发现在某些业务场景下,并不需要将所有的数据关系化,比如下面这个在《数据密集型应用系统设计》中提到的例子,如何用文档型数据库和关系型数据库分别表示简历。一个人可以有多个职位信息和教育信息,所以是一个典型的一对多的关系,如果是关系模型,就是下图的样子,教育,职位等信息都放在单独的表中,并通过外键关联。

如果是通过JSON字符串的形式,则表现为下面的格式,看起来有着非常清晰关系:

但在软件开发领域,最大的不变就是变化,如果此时需求有如下的变动,文档型数据库就会显得力不从心:

  1. 将positions中的organization(组织)和education中的school_name(学校)作为实体而不是字符串

  2. 实现用户的推荐,一个用户可以推荐其他用户的建立

面对如下两种需求,文档型数据库目前的做法就只能是在应用层面做处理。又或者,如果建立联结,可能会变成下面的样子,是不是感觉又回到了上面提到的网络模型,但目前文档数据库还没有引入这样的操作,只是我做的假设。

我将上述的发展历程做成图,会发现一切都很有趣:

总结关系模型和文档模型

接下来将从以下几个方面对关系模型和文档模型进行总结:

应用代码

  1. 业务数据是类似文档的结构,通常一次加载,不需要对其具体内容进行额外处理,关系模型使代码复杂度增加。

  2. 需要引用文档中的嵌套内容,或者需要连接操作,文档模型就只能通过业务代码完成,通用增加了复杂度。

模式灵活性

显然,文档模型的模式更加灵活。模式灵活对于修改数据格式更加友好。

但如果大部分数据具有相同数据结构,模式是一种很好的约束形式。

查询

如果查询遵循局部性原理,那么文档模型有一定的优势,因为不需要去跨多个表进行连接查询,节省了多次的IO操作。

但需要考虑的是,如果实际场景只需要文档中的小部分内容,那么加载整个文档,也会造成资源浪费。

最后想说的是,MySQL 5.7开始,也开始引入JSON这种非结构化的数据类型,有着逐步融合的趋势。虽然看起来,文档结构与最初的层次模型很相似,但也并不代表我们回到了原地,在这个发展历程中总结到的经验,不会让我们盲目选择某种模型,数据模型间可以相互补充,在合适的业务场景下选择合适的数据模型,而不是争论哪种更好,才是我们应该做的事情。

参考:

《数据密集型应用系统设计》

《MongoDB,再见还是再等等》

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

由各大企业移除MongoDB,回看关系模型与文档模型之争相关推荐

  1. 制药企业SAP项目中CSV认证需要准备的文档

    制药企业SAP项目中CSV认证需要准备的文档 CSV,英文全称是Computerized System Validation,中文是计算机化系统验证.很多行业的企业信息化建设过程中,都要确保自己实施的 ...

  2. java计算机毕业设计小型企业员工工资管理系统源码+系统+数据库+lw文档+mybatis+运行部署

    java计算机毕业设计小型企业员工工资管理系统源码+系统+数据库+lw文档+mybatis+运行部署 java计算机毕业设计小型企业员工工资管理系统源码+系统+数据库+lw文档+mybatis+运行部 ...

  3. 基于Java毕业设计大数据文章发布系统源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计大数据文章发布系统源码+系统+mysql+lw文档+部署软件 基于Java毕业设计大数据文章发布系统源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 ...

  4. requestPermissions读写手机存储权限_泛圈云盘可为企业建立高效安全的云办公在线协同文档存储?...

    泛圈企业云盘结合智能手机和无线网络,实现对任何办公地点和办公时间的无缝访问,提高办公效率.它可以连接客户原有的各种IT系统,包括OA.邮件.ERP等各种个人业务系统,使手机也可以用来操作.浏览.管理公 ...

  5. java mongodb 多文档_如何通过Java在MongoDB中一次性插入多个文档

    我在我的应用程序中使用MongoDB,需要在MongoDB集合中插入多个文档. 我使用的版本是1.6 我在这里看到一个例子 在里面 批量插入多个文档部分 作者通过数组来做这件事. 当我尝试相同,但为什 ...

  6. 计算机毕业设计JavaWeb企业客户管理系统(源码+系统+mysql数据库+lw文档)

    计算机毕业设计JavaWeb企业客户管理系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计JavaWeb企业客户管理系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构 ...

  7. 计算机毕业设计Java企业人事管理系统(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java企业人事管理系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java企业人事管理系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构:B/S架构 ...

  8. java计算机毕业设计企业间信息交互系统源代码+数据库+系统+lw文档

    java计算机毕业设计企业间信息交互系统源代码+数据库+系统+lw文档 java计算机毕业设计企业间信息交互系统源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java ...

  9. 计算机毕业设计Javaweb企业档案管理系统(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Javaweb企业档案管理系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Javaweb企业档案管理系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构 ...

最新文章

  1. 44 ansible ad-hoc模式
  2. 每个程序员都应该经历一次软考
  3. 用于python环境下的数据操作_数据分析(一):环境搭建,以及初步操作文件
  4. python简单目标检测代码_Python Opencv实现单目标检测的示例代码
  5. KDD 2021 | 小红书推荐多样性解决方案:SSD在质量、多样性之间获得较好权衡
  6. 对于 IE低版本不兼容问题的处理
  7. 【HANA系列】SAP HANA XS创建XSJOB后台执行
  8. 计蒜课挑战难题:罗马数字转换成整数
  9. python3关键字详解_Python解析、提取url关键字的实例详解
  10. Linux常用命令汇总及示例
  11. strcmp函数php,php strcmp函数怎么用?
  12. ubuntu20禁止hdmi显示器音频输出
  13. 【简简单单来个spider小案例吧】获取emoji表情包
  14. 路由器选华硕还是tp_路由器,网件的好还是华硕的好?
  15. ECharts 绘制地图飞线
  16. kingcms php 下载,KingCMS 通用版_KingCMS官方网站
  17. 一款QQ盗号木马分析
  18. springBoot(6)---文件上传
  19. 利用GF-1 WFV数据估算西北地区地表反照率
  20. 哇!這就是青春痘(下)

热门文章

  1. poj3565(最大权完美匹配)
  2. [CTSC2018]混合果汁 二分 套 主席树上二分
  3. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)
  4. 图论 ---- CF1495D .BFS Trees(图论最短路生成树+枚举计数+树的层次性)
  5. GCD or LCM ---- 处理gcd和lcm同时出现的情况 1499D - The Number of Pairs
  6. 主席树 ---- 2021 ICPC 昆明 M.Stone Games [主席树 + 暴力]
  7. forms身份验证 不跳转_“东湖24小时”玩不够?收好这份指南,365天不重样
  8. 蓝桥杯C++ AB组辅导课
  9. watch监听对象里面值的变化_Vue总结——computed和watch的用法和区别
  10. c语言程序设计数据输入的,1.2 C语言的发展与特点免费阅读_C语言程序设计教程免费全文_百度阅读...