10.规范化数据库设计
本文最后更新于:2021年10月1日 晚上
规范化数据库设计
为什们需要设计?
当数据库比较复杂的时候,我们对数据库进行设计
- 糟糕的数据库设计
- 数据冗余,浪费空间
- (自带外键)数据库插入和删除麻烦
- 程序的性能差
- 良好的数据库设计
- 节省内存空间
- 保证数据库的完整性
- 方便我们开发系统
数据库设计步骤
- 分析需求:分析业务和需要处理的数据库的需求
- 分析要用的表,以及表中需要保存的信息
- 提取和表相关的实体类,讲需求落实到表的每一个字段
- 概要设计:设计关系图E-R图
- 标识实体之间的关系
三大范式
第一范式(1NF)
原子性:要求数据库表的每一列都是不可分割的原子数据项
第二范式(2NF)
前提:满足第一范式
要求表中的每一列都和主键相关库,而不能只与主键的某一部分相关(主要针对联合主键而言)、
示例:联合主键(A,B),但表中C、D和A、B相关,E和B相关,那么对于表(A,B,C,D,E)来说,就不满足第二范式。
因为表的非主键列和主键不是完全相关,即不是:所有非主键列都是和(A,B)相关。
那么就需要拆分表为(A,C,D),(B,E)两个表
第三范式(3NF)
前提:满足第二范式
确保表中的每一列数据都和主键直接相关,而不能间接相关(在2NF的基础上消除传递依赖)
示例:假设表中所有非主键列都完全依赖于主键(满足2NF),但是,有一列C实际上直接相关的是B(也就是说 主键->B->C,传递依赖也满足2NF)
所以我们要把(B,C)单独成表,删除原表中的C(因为原表通过B就可以找到C的信息)
规范型 和 性能的问题
阿里:关联查询的表不超过3个
- 考虑商业化的需求和目标,数据库的性能更重要
- 故意给表增加一些冗余的字段(从多表查询变为单表查询)
- 故意增加一些计算列(从大数据量降低为小数据量)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!