引言:做一个系统往往会用到数据库,数据的设计的好坏直接影响的着执行的效率,所以需要定一个规范,来设计数据库。90%的网站只需要遵循到第三范式或者巴斯范式即可,因为既要考虑到数据设计的简便性(减小冗余),也要考虑到使用性(表连接查询)。
一些基本概念的介绍
举例:球员表有球员编号 |、姓名 、 身份证号 、 年龄 、球队编号
- 超键:包含候选键的任意组合
- 候选键:最小的超键,只由一主键构成(主键的集合)
- 主键:候选键的一个
- 外键:球队编号
- 主属性:主键的属性
- 非主属性:不是主键的属性
第一范式(1NF)
每一个字段都必须是原子性,不可以进一步拆分成更小粒度的字段
第二范式(2NF)
前提:满足第一范式
每一个非主属性都必须完全依赖主属性,如果不行那就将其抽取出来再形成一个表
目的:
数据冗余、插入异常、删除异常、更新异常
第三范式(3NF)
前提:满足第二范式
定义:非主键元素也不能相互影响
反范式化
业务有限的原则,数据中的设计量比较的大,应该添加相应的冗余字段,这样就减少了每一次查询操作没必要的表连接
反范式化新问题
存储空间变大 一个表中的信息修改,相关的表也需要修改 数据量小的情况下,反序列化的优点体现不明显
范式的使用场景
当冗余信息有价值或者能大幅度提高查询效率的时候,才可以考虑增加冗余字段
建议:
不经常修改,不可或缺的字段使用反范式
BCNF(巴斯范式)
名称:是第三范式的优化 || 遵循到第三范式就行
认造成异常的原因:主属性仓库名对于候选键(管理员,物品名)是部分依赖的关系, 这样就有可能导致上面的异常情况。因此引入BCNF,它在 3NF 的基础上消除了主属性对候选键的部分依 赖或者传递依赖关系。
在第三范式上进行优化
1.增加一个仓库,但是还没有存放任何物品。根据数据表实体完整性的要求,主键不能有空值,因 此会出现 插入异常 ;
2. 如果仓库更换了管理员,我们就可能会 修改数据表中的多条记录 ;
3. 如果仓库里的商品都卖空了,那么此时仓库名称和相应的管理员名称也会随之被删除。