MidwayJS 全栈开发(三)SQL 技术选型
MidwayJS 全栈开发(三)SQL 技术选型
前言
上一篇内容回顾:MidwayJS 全栈开发(二)HelloWorld实战 。
大家应该知道,写业务后端主要的关注点就是数据库表设计以及增删改查。 在正式实战使用数据库之前,我们先调研下数据库技术(SQL),以便我们日后技术选型参考,选择合适的数据库解决问题。
数据库介绍
数据库,主要目的就是存储和管理数据,简单理解就是一个“仓库”,通常存储在硬盘中实现数据持久化,同时基于某种规则或方法将数据组织起来。比如:对于关系型数据库,提供索引机制实现快速查询表中的特定数据;通过外键实现不同表数据的关联查询等等。
这里我们按数据库的数据结构进行划分,可以分为两类: - 关系型数据库:表格数据结构设计,列表示字段(column),行表示一条数据记录(Record)。 - 主要场景是存储类似于 Excel 的数据,比较流行的数据库管理系统(RDBMS)包括:MySQL
、SQLite
、PostgreSQL
。 - 非关系型数据库:简称 NoSQL,即不采用表格架构的数据库。 - 它可能存储为简单的键值对,比如:Redis
; - 也可以是 JSON 大对象、xml 文档,比如:MongoDB
;
这里我们针对前面的分类列出来的数据库产品,逐一介绍下。
关系型数据库
首先是关系型数据库,目前开源比较流行的包括:MySQL
、SQLite
、PostgreSQL
。
image.png
MySQL
基本介绍
MySQL 一直都是企业应用程序中最受欢迎的开源数据库。功能丰富,性能稳定,可以说应该没有哪位后端同学不会使用它。目前已经被 Oracle 收购后推出了企业收费版本,具有一定商业性质。
核心特性
- CS架构(Client\Server):监听端口,提供服务
- 安全:支持用户身份验证、加密连接、访问权限控制等
- 复制:支持数据库服务器见库表复制能力,常用于备份、故障切换、负载均衡等场景。
- 可靠稳定可伸缩:支持事务回滚,提交和崩溃恢复、容量扩展理论最高 8TB
- 社区强大:三方扩展和工具非常多,各种操作系统、编程开发语言全支持
使用场景
简单来讲,可以说 MySQL 是国内互联网企业分布式应用程序不错的选择。绝大部分互联网企业都在用它(当然也有历史原因等 dog~)。 - 支持多用户功能 - 高性能并发 - 大数据存储
值得一提,因为 MySQL 真的很流行,其它数据库产品很多都以它作为事实标准做了 API 向后兼容。
安装使用
- 安装参考 菜鸟教程 - MySQL 安装。
- 使用的话,MySQL 基本遵循 SQL 标准语法,一通百通。
SQlite
基本介绍
SQLite 一款流行的轻量级嵌入式数据库。和 MySQL 不同,采用非CS架构,它的数据库就是一个文件,从而无需服务器配置启动进程服务,就可以使用它,直接访问其存储文件。
核心特性
- 轻量级:体积小到最低 250kb、零配置、无服务、低开销
- 单文件:备份直接复制文件、数据量不是很大情况下,读写速度快
- 嵌入式:可移植性强,直接内嵌在应用程序中
使用场景
SQlite 产品本身定位非常清晰,主要用于自给自足的嵌入式应用场景。比如:微信聊天记录就是使用 SQLite 存储在手机本地的。
- 数据是否通过网络与应用程序分开? → 选择客户端/服务器
- 多个并发用户? → 选择客户端/服务器
- 大数据? → 选择客户端/服务器
- 否则 → 选择 SQLite!
参考官方建议如下图:
image.png
安装使用
- 安装参考 菜鸟教程 - SQLite 安装。
- 使用的话,SQlite 遵循 SQL92 标准大多数查询语言功能,满足大部分诉求,当然可能存在一定局限性,值得注意。
PostgreSQL
基本介绍
PostgreSQL 简称 PG,也是一款基于CS架构的开源数据库。值得一提的是,官方自称是世界上最先进的开源数据库,完全由社区驱动维护。
image.png
核心特性
- 最先进:上述 Mysql 支持的基本特性,PG 都支持,并且支持的更好、更强大
- 标准健全:在 SQL 标准实现方面十分完善,几乎支持所有 SQL 标准
- 一专多技:号称全栈型数据库,支持JSON\XML、全文检索、图数据、缓存等能力
使用场景
- PG 号称是全栈型数据库,极大地削减项目额外复杂度,同时也能节省很多成本。作为全栈工程师,非常值得推荐入手。
- 同时,PG 作为最先进的库,功能丰富、更关注数据一致性,针对高可用、高数据一致性要求的领域也非常适合,比如银行、电信等业务。
- 另外,PG 基于 BSD 协议,所以可以基于 PG 源码进行修改,最终打造成自己的数据库产品出来卖钱。
安装使用
- 安装参考 菜鸟教程 - PostgreSQL 安装。
小结
首先是 SQLite,极小的占用空间和极高的可移植性,对于嵌入式应用程序场景,那么可以毫不犹豫的选择它。
对于 PostgreSQL,个人认为大概率是未来的趋势,更适合大型复杂的业务场景,并且具备一打十的全栈型能力,值得花时间学习。
对于 MySQL,我相信它能满足绝大部分互联网 CRUD 的业务,作为最流行的数据库,我相信遇到问题总会有社区解决方案。
非关系型数据库
接下来是非关系型数据库的介绍,目前流行的主要包括 Redis、MongoDB 等。
Redis
基本介绍
一款基于内存的高性能键值对存储的开源数据库。
核心特性
- 键值对:支持
Key-Value
数据存储:key
唯一不能重复;value
支持List
、Set
、Object
等数据结构 - 速度快:数据存在内存中,官方称可达 10w OPS
- 数据持久化:可以将内存中的数据存储到磁盘,重启时自动加载恢复使用
- 线程安全:基于单线程模型实现、无需并发加锁控制
- 数据备份:支持数据的备份和还原
使用场景
- 缓存:发挥内存读取速度快的优势。比如缓存常用数据:登录用户的信息,减少查库时间开销。
- 高频计数:发挥内存花销小的优势。比如统计某评论点赞数,减少高频操作(点赞)对服务器的压力。
安装使用
- 安装参考 菜鸟教程 - Redis 安装。
MongoDB
基本介绍
一款基于文件存储的开源文档型数据库。将数据存储为一个文档,数据结构由键值对提供。
核心特性
- 灵活:无强 Schema 格式约束,存储数据模型类似于 JSON 对象格式。
- 文档存储:以文档结构进行存储,支持大容量存储
值得一提的是,灵活意味着不可控,如果使用不当对存储的数据结构没有很好的设计,往往导致交付一时爽,维护火葬场。
使用场景
- 由于 MongoDB 灵活的特性,对于数据量大且数据结构不固定的业务场景非常适合。比如:前端低代码动态Schema 配置。
- 另外,对于创新型产品前期也可以使用 MongoDB 进行过渡,满足对数据表结构频繁修改的诉求,支持业务快速迭代和交付。
安装使用
- 安装参考 菜鸟教程 - MongoDB 安装。
小结
关于非关系型数据库,主要介绍了 Redis(一般用于缓存) 和 MongoDB(一般用于普通非结构化 JSON 对象数据存储等)。其实它们各自场景定位都非常明确,互不竞争,在一个项目中甚至同时都会用到,所以大家合理选择使用。
除此之外,还有非常流行的其他领域的 NoSQL,比如: - 用于搜索引擎,支持全文检索的 Elasticsearch; - 用于表示图形节点及关系(比如知识图谱),支持图快速遍历的 Neo4J; - 。。。
大家根据不同业务场景合理选择即可,基本上 Redis 和 MongoDB 满足绝大多数 Web 应用场景,后面会在实战中介绍使用。
全文总结
本篇主要介绍了数据库概念以及分类,以及目前比较流行的数据库之间的对比和使用场景介绍。
- 对于结构化数据存储场景,推荐使用 PostgreSQL > MySQL(对于初学者找工作推荐学习 MySQL)
- 对于缓存场景,推荐使用 Redis;
- 对于数据量大非结构化数据存储场景,一般使用 MongoDB;
- 有其他特殊领域场景的,按照本文的思路,按需选择对应数据库即可。