数据库
数据库基础
什么是数据库, 数据库管理系统
- 数据库: db
- 数据库管理系统: database management system dmbs 操作数据库的一个软件
什么是元组, 码, 候选码, 主码, 外码, 主属性, 非主属性?
- 元组: 关系是一张表,元组就是行,列是属性
- 码: 码是标识实体的属性,也就是列
- 候选码: 可以唯一标识一个实体的一个元组,可以是一个列,也可以是多个,并且需要注意的是,候选码是最精简的,不能说,子集也能标识这个实体
- 主码: 也叫主键,在候选码中选出来的,一个实体只有一个,但是可以有多个候选码
- 外码: 外键, 一个表的属性是另一个表的主键,这个属性就是外键
- 主属性: 候选键中出现的列就是主属性
- 非主属性: 没出现过的
ER图
Entity Relationship Diagram
由三个组成
- 实体: 相当于类对象
- 属性: 相当于列
- 联系: 实体和实体之间的关系,一对多,多对一啥的
数据库范式了解吗?
- 第一范式: 属性不能再分
- 第二范式: 再1nf的基础上,消除了非主属性部分函数依赖
- 第三范式: 在2n的基础上,消除了非主属性传递函数依赖
函数依赖,例如,Y依赖于X, 意思是,确定了X的值,可以推出Y的值,类似于主键,我们通过主键的值,可以推出其他列的值,写作 X -> Y,这里理解为推出比较好理解这个写法
部分函数依赖: 举例子, (学号,身份证号,姓名)
学号,身份证号都是主键
学号可以推出姓名
身份证也可以推出姓名
也就是说,姓名,分别依赖于学号 + 身份证号
完全函数依赖: 举例子, (学号,班级,姓名)
这里假设不同的班级学号是有相同的
官方的说法,非主属性,依赖于全部关键字
也就是说,这里的姓名,是依赖于学号 + 班级的
也就是说,你单独知道学号的化,你推不出姓名,单独知道班级的化,你推不出姓名
部分函数依赖 要和完全函数依赖一起看,总结来看,
对于这里的讨论,必须是有多个主键的,才有讨论的价值,如果只有一个主键,那么基本上都是满足第二范式的,因为本来就是完全的函数依赖
部分函数依赖,就是依赖部分的主键, 就是说非主属性,只依赖于一部分的主键
完全函数依赖,就是依赖全部的主键, 反过来说,就是全部的主键加起来,才能推出非主属性
传递函数依赖: 看名字,就能懂,Z 依赖于 Y, Y 依赖于X ,那么Z传递函数依赖于X,就是一个传递的事情,所以需要消除中间的过程,不然会冗余 + 异常
总结
1nf: 属性不能再分
2nf: 非主属性不能部分依赖于主键
3nf: 非主属性不能传递依赖于主键
为什么不推荐外键
太复杂
分库分表不友好
优点:
虽然外键不好,但是也要看情况,如果不涉及分库分表,并发量不高,可以用外键
外键可以保持很好的一致性
级联操作也方便,减少代码量
存储过程
存储过程,可以理解为mysql中的函数,但是不好调试 + 扩展,alibaba禁止
DML DDL DQL
DML: M是Manipulation,操作的意思,也就是增删改查
DDL: 中间的D是definition,定义的意思,和表结构有关,操作表结构的就是ddl
DQL: Q是query的意思,特别从dml中提出来的,因为select不会对表进行破坏
drop delete truncate 区别
- drop: 直接删除表
- truncate: 清数据,表还在,并且自增id从1开始
- delete; 删除行,如果没有where语句,和truncate 差不多
区别:
- 属于不同数据语言,drop是ddl,delete + truncate是dml
- 执行速度不同,drop > truncate > delete ,这个是相当然的,drop要写binlog日志,truncate要重置计数器,所以就是这个速度
数据库设计通常分为哪几步?
- 需求分析 分析自己要干啥
- 概念结构分析: 画er图
- 逻辑结构分析: er图变成表
- 物理结构分析: 设计合理的数据结构
- 数据库实施: 编码 + 测试 + 运行
- 数据库的运行和维护
字符集详解
mysql有两个utf8编码实现,utf8
utf8mb4
字符集是什么?
字符集是字符的集合
将字符转换为二进制,是字符编码
将二进制转换为字符,字符解码
ASCII
美国人发明的,长度为1bit
最高位是0,为校验位,所以ascii码,可以定义128个字符
太少了,所以人们做了拓展,ASCII扩展字符集,它是真正意义上的8bit
所以是256个字符,2的8次方
GB中文字符
GB开头的一般都是中文字符集
Unicode & UTF-8
为了解决世界的字符问题,就用这个统一的字符集Unicode
这个Unicode类似于一个标准,统一了基本上所有的字符
而Unicode没有规定如何存这些字符
所以就有了UTF-8 UTF-16 UTF-32
UTF-8 用1 到 4个字节来存
UTF-16 用2 或 4个字节来存
UTF-32 用4个字节来存
UTF-32,虽然是定长的,但是很耗内存,所以一般用utf-8
MySQL字符集
默认字符集
5.7是latin1 8.0是utf8mb4
utf8 和utf8mb4
utf8只能存1到3个字节,不能存4个字节的表情包 + 复杂的繁体字
utf8mb4,最多支持4个字节,正版,就是为了解决utf8的历史遗留问题