数据库架构
如何设计一个关系型数据库?
范式理论
部分函数依赖:
传递函数依赖:
第一范式
非第一范式:
一个元素一列对应多个属性
姓名 | 兴趣爱好 |
---|---|
李四 | 篮球 象棋 |
存在的问题:数据混乱
第一范式:
一个元素一列只有一个属性
姓名 | 兴趣爱好 |
---|---|
李四 | 篮球 |
李四 | 象棋 |
第二范式
第一范式:
每个人只能有一种兴趣,假设不存在姓名和年龄相同的人
存在部分依赖:
姓名 | 年龄 | 兴趣爱好 | 兴趣类型 |
---|---|---|---|
李四 | 19 | 篮球 | 球类 |
李四 | 18 | 象棋 | 棋类 |
由部分依赖导致的问题:
- 冗余数据:兴趣类型依赖兴趣爱好,兴趣类型冗余
- 插入异常:如果一种兴趣爱好比如足球,暂时没有人喜欢,就不能将“足球 球类"关系插入表中
- 删除异常:如果一种兴趣爱好比如篮球,李四不再喜欢,将会把"篮球 球类"的对应关系也删除
- 修改异常:如果修改一种兴趣爱好的类型,比如“篮球 球类”修改为"篮球 户外球类",需要修改所有的兴趣爱好为篮球的行
第二范式:
姓名 | 年龄 | 兴趣爱好 |
---|---|---|
李四 | 19 | 篮球 |
李四 | 18 | 象棋 |
兴趣爱好 | 兴趣类型 |
---|---|
篮球 | 球类 |
象棋 | 棋类 |
第三范式
第二范式
非主属性传递依赖
每个人只能有一种兴趣
姓名 | 兴趣爱好 | 兴趣类型 |
---|---|---|
张三 | 篮球 | 球类 |
李四 | 足球 | 球类 |
王五 | 象棋 | 棋类 |
姓名->兴趣 -> 类型
由于传递依赖产生问题:
- 冗余数据:兴趣类型依赖兴趣爱好,兴趣类型冗余
- 插入异常:如果一种兴趣爱好比如足球,暂时没有人喜欢,就不能将“足球 球类"关系插入表中
- 删除异常:如果一种兴趣爱好比如篮球,李四不再喜欢,将会把"篮球 球类"的对应关系也删除
- 修改异常:如果修改一种兴趣爱好的类型,比如“篮球 球类”修改为"篮球 户外球类",需要修改所有的兴趣爱好为篮球的行
第三范式
姓名 | 兴趣爱好 |
---|---|
张三 | 篮球 |
李四 | 足球 |
王五 | 象棋 |
兴趣爱好 | 兴趣类型 |
---|---|
篮球 | 球类 |
足球 | 球类 |
象棋 | 棋类 |
BCNF范式
https://baike.baidu.com/item/bcnf/9446795?fr=aladdin#4
第三范式
每名教练只能教一种兴趣爱好
姓名 | 兴趣爱好 | 教练 |
---|---|---|
张三 | 篮球 | 王五 |
张三 | 足球 | 周七 |
李四 | 足球 | 赵六 |
姓名+兴趣爱好->教练
姓名+教练->兴趣爱好
教练->兴趣爱好
上面满足第三范式,但是依旧存在下面的问题:
- 冗余数据:兴趣类型依赖教练,教练和兴趣爱好信息冗余
- 插入异常:如果一种兴趣爱好和教练比如‘象棋 许银川’,暂时还没有人喜欢,就不能将“象棋 许银川"关系插入表中
- 删除异常:如果一种兴趣爱好比如篮球,张三不再喜欢,将会把"篮球 王五"的对应关系也删除
- 修改异常:如果修改一个教练教的兴趣爱好,比如“篮球 王五”修改为"羽毛球 王五",需要修改所有王五的兴趣爱好为羽毛球
BCNF范式
姓名 | 教练 |
---|---|
张三 | 王五 |
张三 | 周七 |
李四 | 赵六 |
兴趣爱好 | 教练 |
---|---|
篮球 | 王五 |
足球 | 周七 |
足球 | 赵六 |
sql语句
https://www.cnblogs.com/diffrent/p/8854995.html
索引
为什么要使用索引
https://blog.csdn.net/lichundongv5/article/details/79611994
什么样的信息能成为索引
区分度较高
索引的数据结构
B+树
https://blog.csdn.net/qq_35008624/article/details/81947773
稀疏索引和密集索引
https://blog.csdn.net/dgutliangxuan/article/details/87895680
如何调优sql
- 查询慢查询sql日志 show variables like ‘slow_query_log_file’
- explain sql 重点关注:type,extra
- 尽量让sql走索引,避免走全表
锁
MyISAM和Innodb关于锁方面的区别
数据库事务的四大特性
- 原子性
- 一致性
- 隔离性
- 持久性
事务隔离级别及各级别下的并发访问问题
更新丢失
脏读 read uncommitted
多次读取同一数据,数据不一致 read committed
幻读 read repeatable
串行 serial
Innodb可重复读隔离级别下如何避免幻读
当前读和快照读
RC、RR级别下的Innodb的非阻塞读如何实现