Mysql、MongoDB?如何选择合适的数据库

Souleigh ✨ 等级 422 0 0

我们正在做一个电子书的小程序。

1.0 层次模型数据库

用户购买,生成订单,订单详情里有用户购买的电子书:

Mysql、MongoDB?如何选择合适的数据库

Mysql、MongoDB?如何选择合适的数据库

一层一层铺开,一对多,这是「层次模型数据库」(Hierarchical Database)。

2.0 网状模型数据库

一笔订单可以购买多本电子书,一本电子书也可以被多笔订单购买: Mysql、MongoDB?如何选择合适的数据库

Mysql、MongoDB?如何选择合适的数据库

这就形成了「多对多」的「网状模型数据库」(Network Database)。

上面讲的两种数据库,也许你听都没听过。

我们用的,是「关系模型」,而非上面的「层次模型」或者「网状模型」。

为什么?

你会说,这样不方便遍历所有订单。

并不会,再加一个根节点就好:

Mysql、MongoDB?如何选择合适的数据库

Mysql、MongoDB?如何选择合适的数据库

你会说,这样查找效率很低。

也不会,因为可以优化下数据结构,比如换成 B+ 树。

为什么我们从一开始就在用「关系模型数据库」?

3.0 关系模型数据库

无论是层次模型还是网状模型,程序员看到的,都是实实在在的物理存储结构。

查询时,你要照着里面的数据结构,用对应的算法来查;

插入时,你也要照着数据结构,用对应算法来插入,否则你就破坏了数据的组织结构,数据也就坏掉了。

因为我们都没用过前面两种数据库,所以觉得「关系模型数据库」(以下简称 RDB)的一切都理所当然,但其实,它做出了一个革命性的变革:

用逻辑结构(logical representation of data)代替物理结构(physical representation of data)

所谓「逻辑结构」,也就是我们经常看到的「表格」,User 是一张表格,Order 是一张表格,Book 又是一张表格,它们之间的关系,用 id 来关联,这些 id,可能是 number 类型,也可能是 string 类型:

Mysql、MongoDB?如何选择合适的数据库

Mysql、MongoDB?如何选择合适的数据库

但你看到的,不一定就是实际的,你看到的只是让你方便理解的「逻辑结构」,真实数据自然不是这样按表格来存储,表格无异于一个数组,数组查询是很慢的。

真实的「物理结构」,也许还是像「层次模型」和「网状模型」一样,是复杂的数据结构。

但到底是怎样的数据结构,你都无需关心,你只需把它想象成一张「表」去操作,就连可视化工具,都会帮你把数据可视化成表,来方便你理解。

这个观念的提出,来自于 1970 年 Codd 的一篇论文,A Relational Model of Data for Large Shared Data Banks:

Future users of large data banks must be protected from having to know how the data is organized in the machine (the internal representation).

Activities of users at terminals and most application programs should remain unaffected when the internal representation of data is changed and even when some aspects of the external representation are changed.

—— Codd

Codd 的这种思想,其实就是经济学里提到的:分工产生效能。

程序员们不需要直接和物理结构打交道,只负责告诉数据库,他想做什么,至于数据是如何存储、如何索引,都交给数据库,最终他们看到的就是一张张特别直观、特别好理解的 excel 表格。

而数据库则把维护物理结构的复杂逻辑,交给了自己, 对程序员屏蔽了复杂的实现细节。

开发时写的代码少了,耦合性降低了,数据也不容易损坏,也就提高了生产效率(productive)。

一切能用同样的耗能,带来更多效能的技术,都会被广泛使用。

NoSQL

那后来为什么又有了 NoSQL 呢?

在 RDB 被发明的时代,软件多用于大型企业,比如银行、金融等等,人们对数据的要求非常纯粹:准确、可靠、安全,让数据按照期望,正确的写入,不要给老子算错钱就好,于是有了具有 ACID 特性的事务:原子性、一致性、隔离性和持久性。

那时候用网络的人很少,通过终端来访问客户端的人,更少,自然的,数据库的数据量和访问量都跟现在没法比,一台机器,足矣,最多再来个一主多从:

Mysql、MongoDB?如何选择合适的数据库

Mysql、MongoDB?如何选择合适的数据库

后来,你知道的,每个人手里都有个手机,每分每秒,都有成千上万的数据,写入你的数据库、从你的数据库被查出,于是有了「分布式」,有了 BASE 和 CAP。这时候,RDB 就会发现,自己之前的那一套 ACID,竟然有点作茧自缚了:

  • 为了保证事务的隔离性,要进行加锁,在分布式的环境下,就要对多台机器的数据进行加锁;
  • 为了保证事务的原子性,在机器 A 的操作和在机器 B 的操作,要么一起成功,要么一起失败;
  • ……

这些都要去不同节点的机器进行通讯和协调,实现起来非常复杂,而且要付出更多的网络 IO,影响性能。

ACID 在分布式系统上实现起来就会变得难以实现,即使实现了,也要付出很大的性能成本,于是才有了后来的各种「分布式一致性协议」,Paxos、Raft、2PC …… 而 Mysql 也提供了各种方案来实现分布式,当然,这些方案自然是很复杂的,比如 「NDB Cluster」 :

Mysql、MongoDB?如何选择合适的数据库

Mysql、MongoDB?如何选择合适的数据库

而 NoSQL 则没有这么多承诺,它的一致性,一般都是最终一致性,当然你可以选择强一致,那自然就要付出点性能作为代价,当然你还可以弱一致,这样会更不安全,但是更快,一切取决于你对数据的要求。

除此之外,RDB 的「数据库范式」(Database Schema),也成了限制扩展性的瓶颈。为了避免数据冗余导致的各种问题(占用空间、删除异常、更新异常等等),我们在设计关系模型时,通常都是按照最小单位来设计的。

什么叫最小单位,比如用户有地址和爱好,那么在正确设计的关系模型(比如 3NF)里,这就是三张表:

Mysql、MongoDB?如何选择合适的数据库

Mysql、MongoDB?如何选择合适的数据库

如果这三张表被分散在不同的机器,那进行关联查询时,就需要多次跨机器的通讯;

而对于 NoSQL,这三类信息,都可以利用 Json 格式的数据,将它们存放在一起:

Mysql、MongoDB?如何选择合适的数据库

Mysql、MongoDB?如何选择合适的数据库

完整的存储进去,完整的取出来,不需要额外的操作。

NoSQL 比 RDB 有更强的扩展性,可以充分利用分布式系统来提升读写性能和可靠性。

这不是谁设计好坏的问题,而是跟他们要解决的问题有关:RDB 诞生于互联网萌芽的时代,那时数据的准确、可靠是最重要的,而 NoSQL 诞生于互联网快速发展普及的时代,大数据、分布式、扩展性成了数据库的另一个重要特性。

总结一下:

  • RDB 首先得是准确、可靠,然后才向更高的「可拓展性」发展;
  • 而 NoSQL 生而分布式,可拓展性强,然后才向更高的「准确性」发展。

NoSQL ,not only SQL,其实就是对那种打破了 RDB 严格事务和关系模型约束的那些数据库的泛指,而随着要解决的问题的不同,又诞生了各种各样的 NoSQL。

首先是「列式数据库」(Column-oriented DBMS),数据量上去了,我们想分析网站用户的年龄分布,简单说,就是你需要对同一个特征进行大数据量的分析统计,于是把原来 RDB 的「按行存储」的范式打破,变成了「按列存储」,比如 HBase;

然后你发现有些数据变动不是很大,但是经常需要被查询, 查询时还要关联很多张表,于是你把这些来自不同表的数据,揉成一个大对象,按 key-value 的格式存起来,比如 Redis;

再后来你需要对博客内容进行相关性搜索,传统 RDB 不支持相关性搜索,最重要的,还是扩展性差,增加机器的带来边际效益有限,于是有了「全文搜索引擎」,比如 Elasticsearch;

除此之外,还有「文档数据库」、「图形数据库」……

没有一种数据库是银弹。

总结

这篇文章的题目是「如何选择数据库」,这是困扰很多人的问题,那么多数据库,到底要选什么好?

可是当你问出这样一个问题时,其实你是在问一种「手段」。我现在要做这样一个需求,用什么数据库可以帮我实现它?

但其实你需要的不只是一种「手段」,因为如果对方甩给你一个冷冰冰的名字,Mysql、Elasticsearch、MongoDB,你肯定会问,凭什么?

你需要的,是一种「解决方案」。如果你需要数据十分严格准确,分毫不差,那我会推荐你采用「事务」和「关系模型」来处理数据;如果你需要数据能够被大量读取和写入,那我会推荐你扩展性强的「分布式」;如果你的数据经常是整个读取、整个更新的,那「关系模型」就没有「文档模型」适合你。

「事务」、「关系模型」、「分布式」、「文档模型」等等,这些就是「解决方案」,知道用什么「解决方案」,用哪个数据库,自然水到渠成。

正如一位大牛说的:

设计实践中,要基于需求、业务驱动架构。无论选用 RDB/NoSQL,一定是以需求为导向,最终数据存储方案必然是各种权衡的综合性设计。

用户不会因为你用了 Mysql 或者 MongoDB 而使用你的软件,毕竟绝大多数用户都不知道 Mysql 和 MongoDB 是什么玩意。

收藏
评论区

相关推荐

Mysql、MongoDB?如何选择合适的数据库
我们正在做一个电子书的小程序。 1.0 层次模型数据库 用户购买,生成订单,订单详情里有用户购买的电子书: Mysql、Mongo
postgresql和mysql哪个好
postgresql和mysql都是免费且功能强大的开源数据库,很多用户面对这两个库都会有一个问题,那就是哪一个才是最好的开源数据库,MySQL还是PostgreSQL呢?该选择哪一个开源数据库呢? postgresql和mysql哪个好 一.PostgreSQL相对于MySQL的优势 1、在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨;
[DB]PostgreSQL 与 MySQL 相比,优势何在?
PostgreSQL 与 MySQL 相比,优势何在? 数据库 知乎 Pg 没有 MySQL 的各种坑 MySQL 的各种 text 字段有不同的限制, 要手动区分 small text, middle text, large text... Pg 没有这个限制, text 能支持各种大小. 按照 SQL 标准, 做 null 判断不能用
MySQL的语句执行顺序
今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序: sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。  一、sql执行顺序 
golang实现MySQL数据库事物的提交与回滚
MySQL 事务主要用于处理操作量大,复杂度高的数据。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务用来管理 insert,update,delete 语句,事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicit
哪些场景下使用MongoDB
为什么需要MongoDB (https://blog.csdn.net/tanqian351/article/details/81744970)MongoDB与MySQL的区别 关于MongoDB
Go语言操作mongoDB
Go语言操作mongoDB mongoDB是目前比较流行的一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库(NoSQL)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 mongoDB介绍 mongoDB(https://www.mongodb.com/)是目前比较流行
47 张图带你 MySQL 进阶!
我们在 MySQL 入门篇主要介绍了基本的 SQL 命令、数据类型和函数,在局部以上知识后,你就可以进行 MySQL 的开发工作了,但是如果要成为一个合格的开发人员,你还要具备一些更高级的技能,下面我们就来探讨一下 MySQL 都需要哪些高级的技能
Windows平台快速安装MongoDB和Robo 3T
一、简介 1.数据库简介传统的数据库都是关系型数据库,包括MySQL、SQL Server等。但是随着业务需求的提高,传统数据库往往难以满足业务的需要,因此逐步出现了很多NoSQL数据库,包括MongoDB和Redis等,今天主要来介绍MongoDB和可视化工具Robo 3T的安装。 2.安装包下载MongoDB可以在官网下载,如下:Robo 3
MySQL基础(非常全)
MySQL基础一、MySQL概述1、什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库2、什么是 MySQL、Oracle、SQLite、Access、MS SQL Server等 ? 答:他们均是一个软件,都有两个主要的功能: a. 将数据保存到文件或内存 b. 接收特定的命令,然后对文件进行相应
MySQL(一)MySQL基础介绍
最近的学习内容是数据库相关的一些知识,主要以MySQL为主,参考书籍——《MySQL必知必会》MySQL学习及下载地址:https://dev.mysql.com/MySQL学习使用注意事项:1、必须访问一个已有的MySQL服务器,需要一个服务器账号(一个登录名和一个口令)2、MySQL运行在所有主要平台上,包括Windows、Linux、Solaris、M
Mysql Workbench使用教程
<1 MySQL WorkbenchMySQL Workbench 为数据库管理员、程序开发者和系统规划师提供可视化的Sql开发、数据库建模、以及数据库管理功能。 <2.MySQL Workbench 的下载和安装 (1)安装最新MySql时,有是否安装MySql Workbench的选项,可选择安装。 (2)可以独立安装MySql Workbench。
一文读懂一条 SQL 查询语句是如何执行的
2001 年 MySQL 发布 3.23 版本,自此便开始获得广泛应用,随着不断地升级迭代,至今 MySQL 已经走过了 20 个年头。为了充分发挥 MySQL 的性能并顺利地使用,就必须正确理解其设计思想,因此,了解 MySQL 的逻辑架构是必要的。本文将通过一条 SQL 查询语句的具体执行过程来详细介绍 MySQL 架构中的各个组件。MySQL 逻辑架构
Python中如何判断表的存在
MySQL如何判断表是否存在MySQL判断表是否存在可以使用下面语句:select from informationschema.tables where tablename 'student';select from informationschema.tables where tablename 'teacher';SQL语句说明:informati
想抓住大数据时代?小众数据库不可小觑
大家好,我是Python进阶者,今天给大家来送书啦 随着大数据时代的发展,诞生了一大批大数据时代下的新数据库产品,如今MongoDB、Redis、HBase这些NoSQL数据库已经成为了互联网开发的新标配,SQL一统江湖的时代不复存在了。 然而,如果你觉得只要学习了上边这几种NoSQL你就抓住了大数据时代的话,你可就大错特错了!大数据时代发展速度之快