持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
Koa洋葱模型
这其实是一个概念性的东西,但其实了解了koa的源码之后,我们会发现洋葱模型非常容易理解
比如我们在app中注册了很多的中间件,那么在用户发送了请求之后,中间件会按照注册的顺序依次执行(如果每个中间件都在末尾执行next函数的话),这个过程就很像是我们在洋葱外面一层层的进入到洋葱的内部,比如下面的代码:
const Koa = require('koa')
const app = new Koa()
app.use((ctx, next) => {
next()
ctx.body = ctx.message
})
app.use((ctx, next) => {
next()
})
app.use((ctx, next) => {
ctx.message = 'Hello World'
})
app.listen(8000, () => {
console.log('Koa初体验服务器启动成功~');
})
首先代码会来到中间件1,因为其调用了next函数,所以又会去到中间件2,因为中间件2中也调用了next函数,所以代码又会来到中间件3中执行,等到中间件3执行完毕后又会回到中间件2,等到中间件2执行完毕后又会回到中间件1,最后所有的中间件都执行完毕后返回响应数据给客户端,整个请求-通信的流程就结束了。
代码的执行是从middleware1 -> middleware2 -> middleware3 -> middleware2 -> middleware1,就相当于是从洋葱的最外层走到了最里面,然后又从最里面走到了最外层才响应结果
但那么说的话,express好像也有洋葱模型,但是由于其源码中next函数的处理方式和koa的不同,其只有在中间件都是同步函数的情况下才符合洋葱模型,而koa无论中间件是同步的还是异步的,都有办法让其符合洋葱模型
MySQL
为什么需要数据库?
任何软件系统都需要存放大量的数据,这些数据通常是非常复杂和庞大的:
- 比如用户信息包括姓名、年龄、性别、地址、身份证号、出生日期等等
- 比如商品信息包括商品的名称、描述、价格(原价)、分类标签、商品图片等等
- 比如歌曲信息包括歌曲的名称、歌手、专辑、时长、歌词信息、封面图片等等
那么这些信息不能直接存储到文件中吗?可以,但是文件系统有很多的缺点
- 很难以合适的方式组织数据(多张表之前的关系合理组织)
- 并且对数据进行增删改差的复杂操作(虽然一些简单确实可以),并且保证单操作的原子性(不能同时去修改同一个数据)
- 很难进行数据共享,比如一个数据库需要为多个程序服务,如何进行很好的数据共享
- 需要考虑如何进行数据的高效备份、迁移、恢复等等
数据库通俗来讲就是一个存储数据的仓库,数据库本质上就是一个软件、一个程序
常见的数据库有哪些?
通常我们将数据库划分成两类:关系型数据库和非关系型数据库:
-
关系型数据库:
MySQL、Oracle、DB2、SQL Server、Postgre SQL等- 关系型数据库通常我们会创建很多个二维数据表
- 数据表之间相互关联起来,形成一对一,一对多,多对多等关系
- 之后可以利用
SQL语句在多张表中查询我们所需的数据 - 支持事务,对数据的访问更加的安全
-
非关系型数据库:
MogoDB、Redis、Memcached、HBse等- 非关系型数据库的英文其实是
Not Only SQL,也简称为NoSQL - 相对于关系型数据库会比较简单一些,存储数据也会更加自由(甚至我们可以直接将一个复杂的
json对象直接塞入到数据库中) - NoSQL是基于
Key-Value的对应关系,并且查询的过程中不需要经过SQL解析,所以性能更高 - NoSQL通常不支持事务,需要在自己的程序中来保证一些原子性的操作(加锁解锁等操作)
- 非关系型数据库的英文其实是
-
如何在开发中选择他们呢?具体的选择会根据不同的项目进行综合的分析,这里有一些建议
- 目前在公司进行后端开发(
Node、Java、Go等),还是以关系型数据库为主 - 比较常用到非关系型数据库的场景:在爬取大量的数据进行存储时直接将爬取下来的json数据存到数据库中
- 目前在公司进行后端开发(
认识MySQL
MySQL的介绍:
- MySQL原本是一个开源的数据库,原开发者为瑞典的
MySQL AB公司 - 在
2008年被Sun(开发了Java语言的公司)公司收购;在2009年,Sun公司被Oracle(甲骨文公司)收购 - 所以目前MySQL归属于Oracle公司
MySQL是一个关系型数据库,其本质上就是一个软件、一个程序
- 这个程序中管理着多个数据库
- 每个数据库中可以有多张表
- 每个表中可以有多条数据
终端连接数据库
如果我们想要操作数据,需要先和数据建立一个连接,最直接的方式就是通过终端来连接,主要有两种方式:
- 方式一:
mysql -uroot -p你的密码 - 方式二:
mysql -uroot -p,输入这行指令之后会让你继续数据密码
终端操作数据库 - 显示数据库
我们说过,一个数据库软件中,可以包含很多个数据库,如何查看数据库呢?我们可以在终端使用show databases;指令,注意分号;是不能少的
MySQL默认的数据库:
information_schema:信息数据库,其中包括MySQL在维护的其他数据库、表、列、访问权限等信息performance_schema:性能数据库,记录着MySQL Server数据库引擎在运行过程中的一些资源消耗相关的信息mysql:用于存储数据管理者的用户信息、权限信息以及一些日志信息等sys:相当于是一个简易版的performance_schema,将性能数据库中的数据汇总成更容易理解的形式
终端操作数据库 - 创建数据库和表
在终端直接创建一个属于自己的新的数据库(一般情况下一个新的项目会对应一个新的数据库)
create database 数据库名称;
使用我们创建的数据库
use 数据库名称;
在数据中建一张表
create table 表名称(表对应的字段名称以及类型);
在表中插入数据
insert into 表名(字段名称) values (字段对应的值);
GUI工具的介绍
我们会发现在终端操作数据库有很多不方便的地方
- 语句写出来没有高亮,并且不会有任何的提示
- 复杂的语句分成多行,格式看起来并不美观,很容易出现错误
- 终端中查看所有的数据库或者表现的非常不直观和不方便等等
所以在开发中,我们可以借助于一些GUI工具来帮助我们连接上数据库,之后直接在GUI工具中操作就会非常方便,我们这里推荐Navicat
认识SQL语句
我们希望操作数据库(特别是在程序中),就需要有和数据库沟通的语言,这个语言就是SQL
- SQL称为结构化查询语言
- 使用SQL编写出来的语句,就成为SQL语句
- SQL语句可以用于对数据库进行操作
事实上,常见的关系型数据库SQL语句都是比较相似的,所以你学会了MySQL中的SQL语句,之后去操作比如Oracle或者其他关系型数据库也是非常方便的
SQL语句的常用规范:
- 通常关键字是大写的,比如
CREATE、TABLE、SHOW等等 - 一条语句结束后,需要以;结尾
- 如果遇到关键字作为表名或者字段名,可以使用
``包裹
SQL语句的分类
常见的SQL语句我们可以分成4类
-
DDL:数据定义语言- 可以通过DDL语句对数据库或表进行:创建、删除、修改等操作
-
DML:数据操作语言- 可以通过DML语句对表进行:添加、删除、修改等操作
-
DQL:数据查询语言- 可以通过DQL从数据库中查询记录
-
DCL:数据控制语言- 对数据库、表的权限进行相关访问控制操作
数据库的操作
- 查看所有的数据库
SHOW DATABASES;
- 选择某一个数据库
USE test;
- 查看当前正在使用的数据库
SELECT DATABASE();
- 创建一个新的数据库
# 如果这个数据库已经存在,那么执行下面的指令是会报错的
CREATE DATABASE newbase;
# 所以我们创建数据库的时候最好先判断一下其存不存在,不存在再创建
CREATE DATABASE IF NOT EXISTS newbase;
# 创建数据库的时候指定对应的字符集和排序规则
CREATE DATABASE IF NOT EXISTS newbases DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;
- 删除数据库
# 如果这个数据库不存在,那么执行下面的指令是会报错的
DROP DATABASE newbases;
# 所以我们在删除数据库的时候最好先判断一下其存不存在,存在再删除
DROP DATABASE IF EXISTS newbases;
- 修改数据库的编码
ALTER DATABASE a CHARACTER SET = utf8 COLLATE = utf8_lithuanian_ci;
数据表的操作
- 查看所有的表
SHOW TABLES;
- 新建表
CREATE TABLE IF NOT EXISTS `haha` (
`name` VARCHAR(10),
`age` INT,
`score` INT
);
- 查看表的结构
DESC haha;
- 查看创建表的SQL语句
SHOW CREATE TABLE `haha`;
- 删除表
DROP TABLE IF EXISTS `haha`;
SQL的数据类型
我们知道不同的数据会划分为不同的数据类型,在数据库中也是一样
MySQL支持的数据类型有:数字类型,日期和时间类型,字符串(字符和字节)类型,空间类型和JSON数据类型
数字类型
MySQL的数字类型有很多:
- 整数数字类型:
INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT - 浮点数字类型:
FLOAT、DOUBLE(FLOAT是4个字节,DOUBLE是8个字节) - 精度数字类型:
DECIMAL、NUMERIC(DECIMAL是NUMERIC的实现形式)
日期类型
YEAR以YYYY格式显示值
- 范围
1901到2155,还有0000
DATE类型用于具有日期部分但没有时间部分的值
- DATE以格式
YYYY-MM-DD显示值 - 支持的范围是
1000-01-01到9999-12-31
DATETIME类型用于包含日期和时间部分的值:
- DATETIME以格式
YYYY-MM-DD hh:mm:ss显示值 - 支持的范围是
1000-01-01 00:00:00到9999-12-31 23:59:59
TIMESTAMP类型(开发中用的最多的类型)用于包含日期和时间部分的值:
- TIMESTAMP以格式YYYY-MM-DD hh:mm:ss显示值
- 但是它的范围是UTC的时间范围:1
970-01-01 00:00:01到2038-01-19 03:14:07
另外:DATETIME或TIMESTAMP值可以包括在高达微秒(6位)精度的后小数秒一部分
- 比如DATETIME表示的范围可以是
1000-01-01 00:00:00.000000到9999-12-31 23:59:59.000000
字符串类型
MySQL的字符串类型表示方法如下:
-
CHAR类型在创建表时为固定长度,长度可以是0到255之间的任何值- 在被查询时,会删除后面的空格
-
VARCHAR类型(开发中用的最多)的值是可变长度的字符串,长度可以制定为0到65535之间的值- 在被查询时,不会删除后面的空格
BINARY和VARBINARY类型用于存储二进制字符串,存储的是字节字符串BLOB用于存储大二进制类型TEXT用于存储大的字符串类型