MidwayJS 全栈开发(三)SQL 技术选型

1,248 阅读8分钟

image.png

前言

上一篇内容回顾:MidwayJS 全栈开发(二)HelloWorld实战

大家应该知道,写业务后端主要的关注点就是数据库表设计以及增删改查。 在正式实战使用数据库之前,我们先调研下数据库技术(SQL),以便我们日后技术选型参考,选择合适的数据库解决问题。


数据库介绍

数据库,主要目的就是存储和管理数据,简单理解就是一个“仓库”,通常存储在硬盘中实现数据持久化,同时基于某种规则或方法将数据组织起来。比如:对于关系型数据库,提供索引机制实现快速查询表中的特定数据;通过外键实现不同表数据的关联查询等等。

这里我们按数据库的数据结构进行划分,可以分为两类:

  • 关系型数据库:表格数据结构设计,列表示字段(column),行表示一条数据记录(Record)。
    • 主要场景是存储类似于 Excel 的数据,比较流行的数据库管理系统(RDBMS)包括:MySQLSQLitePostgreSQL
  • 非关系型数据库:简称 NoSQL,即不采用表格架构的数据库。
    • 它可能存储为简单的键值对,比如:Redis
    • 也可以是 JSON 大对象、xml 文档,比如:MongoDB;

这里我们针对前面的分类列出来的数据库产品,逐一介绍下。


关系型数据库

首先是关系型数据库,目前开源比较流行的包括:MySQLSQLitePostgreSQL

image.png

MySQL

基本介绍

MySQL 一直都是企业应用程序中最受欢迎的开源数据库。功能丰富,性能稳定,可以说应该没有哪位后端同学不会使用它。目前已经被 Oracle 收购后推出了企业收费版本,具有一定商业性质。

核心特性

  • CS架构(Client\Server):监听端口,提供服务
  • 安全:支持用户身份验证、加密连接、访问权限控制等
  • 复制:支持数据库服务器见库表复制能力,常用于备份、故障切换、负载均衡等场景。
  • 可靠稳定可伸缩:支持事务回滚,提交和崩溃恢复、容量扩展理论最高 8TB
  • 社区强大:三方扩展和工具非常多,各种操作系统、编程开发语言全支持

使用场景

简单来讲,可以说 MySQL 是国内互联网企业分布式应用程序不错的选择。绝大部分互联网企业都在用它(当然也有历史原因等 dog~)。

  • 支持多用户功能
  • 高性能并发
  • 大数据存储

值得一提,因为 MySQL 真的很流行,其它数据库产品很多都以它作为事实标准做了 API 向后兼容。

安装使用

SQlite

基本介绍

SQLite 一款流行的轻量级嵌入式数据库。和 MySQL 不同,采用非CS架构,它的数据库就是一个文件,从而无需服务器配置启动进程服务,就可以使用它,直接访问其存储文件。

核心特性

  • 轻量级:体积小到最低 250kb、零配置、无服务、低开销
  • 单文件:备份直接复制文件、数据量不是很大情况下,读写速度快
  • 嵌入式:可移植性强,直接内嵌在应用程序中

使用场景

SQlite 产品本身定位非常清晰,主要用于自给自足的嵌入式应用场景。比如:微信聊天记录就是使用 SQLite 存储在手机本地的。

  1. 数据是否通过网络与应用程序分开? → 选择客户端/服务器
  2. 多个并发用户? → 选择客户端/服务器
  3. 大数据? → 选择客户端/服务器
  4. 否则 → 选择 SQLite!

参考官方建议如下图: image.png

安装使用

  • 安装参考 菜鸟教程 - SQLite 安装
  • 使用的话,SQlite 遵循 SQL92 标准大多数查询语言功能,满足大部分诉求,当然可能存在一定局限性,值得注意。

PostgreSQL

基本介绍

PostgreSQL 简称 PG,也是一款基于CS架构的开源数据库。值得一提的是,官方自称是世界上最先进的开源数据库,完全由社区驱动维护。

image.png

核心特性

  • 最先进:上述 Mysql 支持的基本特性,PG 都支持,并且支持的更好、更强大
  • 标准健全:在 SQL 标准实现方面十分完善,几乎支持所有 SQL 标准
  • 一专多技:号称全栈型数据库,支持JSON\XML、全文检索、图数据、缓存等能力

使用场景

  • PG 号称是全栈型数据库,极大地削减项目额外复杂度,同时也能节省很多成本。作为全栈工程师,非常值得推荐入手。
  • 同时,PG 作为最先进的库,功能丰富、更关注数据一致性,针对高可用、高数据一致性要求的领域也非常适合,比如银行、电信等业务。
  • 另外,PG 基于 BSD 协议,所以可以基于 PG 源码进行修改,最终打造成自己的数据库产品出来卖钱。

安装使用

小结

首先是 SQLite,极小的占用空间和极高的可移植性,对于嵌入式应用程序场景,那么可以毫不犹豫的选择它。

对于 PostgreSQL,个人认为大概率是未来的趋势,更适合大型复杂的业务场景,并且具备一打十的全栈型能力,值得花时间学习。

对于 MySQL,我相信它能满足绝大部分互联网 CRUD 的业务,作为最流行的数据库,我相信遇到问题总会有社区解决方案。


非关系型数据库

接下来是非关系型数据库的介绍,目前流行的主要包括 Redis、MongoDB 等。

Redis

基本介绍

一款基于内存的高性能键值对存储的开源数据库。

核心特性

  • 键值对:支持 Key-Value 数据存储:key 唯一不能重复;value 支持 ListSetObject 等数据结构
  • 速度快:数据存在内存中,官方称可达 10w OPS
  • 数据持久化:可以将内存中的数据存储到磁盘,重启时自动加载恢复使用
  • 线程安全:基于单线程模型实现、无需并发加锁控制
  • 数据备份:支持数据的备份和还原

使用场景

  • 缓存:发挥内存读取速度快的优势。比如缓存常用数据:登录用户的信息,减少查库时间开销。
  • 高频计数:发挥内存花销小的优势。比如统计某评论点赞数,减少高频操作(点赞)对服务器的压力。

安装使用

MongoDB

基本介绍

一款基于文件存储的开源文档型数据库。将数据存储为一个文档,数据结构由键值对提供。

核心特性

  • 灵活:无强 Schema 格式约束,存储数据模型类似于 JSON 对象格式。
  • 文档存储:以文档结构进行存储,支持大容量存储

值得一提的是,灵活意味着不可控,如果使用不当对存储的数据结构没有很好的设计,往往导致交付一时爽,维护火葬场。

使用场景

  • 由于 MongoDB 灵活的特性,对于数据量大且数据结构不固定的业务场景非常适合。比如:前端低代码动态Schema 配置。
  • 另外,对于创新型产品前期也可以使用 MongoDB 进行过渡,满足对数据表结构频繁修改的诉求,支持业务快速迭代和交付。

安装使用

小结

关于非关系型数据库,主要介绍了 Redis(一般用于缓存) 和 MongoDB(一般用于普通非结构化 JSON 对象数据存储等)。其实它们各自场景定位都非常明确,互不竞争,在一个项目中甚至同时都会用到,所以大家合理选择使用。

除此之外,还有非常流行的其他领域的 NoSQL,比如:

  • 用于搜索引擎,支持全文检索的 Elasticsearch;
  • 用于表示图形节点及关系(比如知识图谱),支持图快速遍历的 Neo4J;
  • 。。。

大家根据不同业务场景合理选择即可,基本上 Redis 和 MongoDB 满足绝大多数 Web 应用场景,后面会在实战中介绍使用。


全文总结

本篇主要介绍了数据库概念以及分类,以及目前比较流行的数据库之间的对比和使用场景介绍。

  • 对于结构化数据存储场景,推荐使用 PostgreSQL > MySQL(对于初学者找工作推荐学习 MySQL)
  • 对于缓存场景,推荐使用 Redis;
  • 对于数据量大非结构化数据存储场景,一般使用 MongoDB;
  • 有其他特殊领域场景的,按照本文的思路,按需选择对应数据库即可。