Skip to content

数据库 DataBase

数据库不是一个高深的概念. 包括现实中的档案室, 文件夹, 书籍. 任何实体的东西, 你都可以称之为数据库.

我们真正要研究的是数据库管理系统 DBMS(DataBase Manage System), 也就是我们经常说到的 mysql, redis, mongodb, sqlite 等等.

数据库分类

SQLNoSql
数据结构结构化的非结构化(非强制)
数据关联性关联的非关联的(非强制)
操作SQL 语句各自的语法
事务支持部分支持
使用场景1. 数据结构固定
2. 安全性一致性高
1. 数据结构不固定(当然你可以在程序中约束固定)
2. 高性能要求的
3. 无需支持事务的
SQLNoSql
1. oracle
2. mysql
3. sqlite
1. MongoDB
2. Redis
3. HBase

查询语言 SQL

SQL 是 Structured Query Language 的缩写, 意为结构化的查询语言. 在支持 SQL 的数据库中, 每一条 SQL 语句会被发送到数据库, 数据库程序会解析其含义并根据含义输出不同的结果到客户端(SQL 语句发起者).

ORM

ORM 是 Object Relation Map 的缩写, 意为对象关系映射.

ORM 实际上就是在 SQL 和程序发起者之间加了一层(起到适配器的作用), ORM 提供各种程序可以调用的 API(相比 SQL 来说, ORM 能够具备更好的代码提示, 补全, 可读性, 可维护性), ORM 再根据客户端的输入转化为对应的 SQL 语句或者其他数据库的查询系统.

事务 Transaction

事务表示一组操作. 当一组操作全部完成了, 事务即完成, 一组操作失败其中某一个操作, 事务失败.

尤其是在涉及到金钱和其他比较复杂的操作时, 需要使用到事务.

ACID 原则

事务的 4 个特性. 以下 4 个单词的缩写. 名词很专业, 其实很 nt.

  • Atomicity 原子性 即事务的一组操作要成功全成功, 否则失败
  • Consistency 一致性 (...)
  • Isolation 隔离性 即事务之间不能相互影响, 多个事务不能同时操作相同数据.
  • Durability 持久性 (就算没有事务, 单单改变某一个数据也是持久化的, 持久化不是事务独有的.)

集群 Cluster

集群是一种分布式概念, 指的是一群资源的组合。

数据库的集群方式分两种, 一种是主从集群, 一种是分片集群。

主从集群

主从集群是为了支持程序的高可用, 他保证你在任意一个节点服务不可用的情况下, 任意其他的节点能够迅速顶上。

从数据上来讲, 无论是主节点还是从节点,保存的数据都是一样的,因此任意节点在主节点不可用后才能够顶上。

读写分离就是一种主从集群模式,读和写是 2 个库,由于读和写不在同一个库中完成, 因此数据库不用同时承受读和写的并发压力。

主从集群能够有效提高数据库的读写并发能力,但不能够增加数据的存储量,同时当数据量过多时仍然会达到瓶颈。

分片集群

分片集群通过将数据分开放到不同的节点中,能够阻止数据达到单个数据库的性能瓶颈。

方式

  • 设置单个库的上限,上限到了之后继续创建下一个库
    • 集群扩展性好
    • 不同的节点压力会不一样
    • 容易备份
  • 预设多个库, 均衡写入
    • 扩展性不好,你一开始可能得搞上很多数据库。
    • 不同节点压力一致

SQL 语句

总体遵循: 如何处理(增删改查)哪张表(表名)的哪些数据(查询条件)

sql
-- 查: select 查命令, * 全部字段, from Users 从Users这个表中
select * from Users;

-- 改
update Users set name='xxx', school='xxx'

-- 删
delete from Users where id='xxx'

-- 增
insert into Users (name, age, school) values ('xxx', 20, 'xx')

where / where not 子句

指定条件, 表示对操作命令范围的一个限定.

多个条件在每个条件中使用 and 拼接, 表示既满足...又满足..., 使用 or 拼接表示满足其中一个即可

where not表达的思想用编程语言表达为:

ts
let a = 1,
  b = 2
let result1 = a === 1 && b === 2
let result2 = !(a !== 1 || b !== 2)

运算符有以下几种

运算符描述
=
<>不等于
>
<
>=
<=
between
like像, like %a% -> babb满足, baa满足, abb不满足
infield in (1,2,3) 就等于 field=1 or field=2 or field=3
sql
-- 查找id为xxx的用户
select * from Users where id='xxx';

-- 查找name为xxx且学校为xxx的用户
select * from Users where id='xxx' and school='xxx';

--

join 关联查询

聚合

MIT Licensed