数据库的规范化
要去设计一个存放实体的表,先要了解一下数据库的关系规范化,减少不好关系存在,设计一个优良的模型。
第一范式
第一范式是指数据库的每一列都是不可分割的基本数据项,比如下面这种就是可以分割的情况。
学生(姓名,电话号码)
电话号码包括了 家用座机 和移动电话,因此可以被拆分为:
学生(姓名,家用座机,移动电话)
才满足第一范式要求,第一范式是要满足的最基本要求。
第二范式
第二范式要求必须存在主键,其他属性必须完全依赖主键存在,比如:
学生(学号,姓名,性别)
学号是每个学生的唯一标识,每个学生有不同的学号,每个学生的所有属性都依赖于学号,学号发生改变学生就要发生改变,姓名和性别也因此发生改变,所有此表满足第二范式。
第三范式
满足第二范式的情况下,所有的属性都不传递依赖于主键,满足第三范式。
学生借书情况(借阅编号,学生学号,书籍编号,书籍名称,书籍作者)
实际上书籍编号依赖于借阅编号,而书籍名称和书籍作者依赖于书籍编号,存在传递依赖关系,可以将书籍信息拆分称为另外一张表:
学生借书情况(借阅编号,学生学号,书籍编号)
书籍(书籍编号,书籍名称,书籍作者)
如此消除了传递依赖,满足第三范式要求。
BCNF
BCNF作为第三范式的补充,假设仓库管理关系表为StorehouseManage(仓库ID、存储物品ID,管理员ID,数量),一个管理员只能在一个仓库工作,一个仓库可以存储多种物品,这个数据库表存在如下决定关系:
(仓库ID,存储物品ID)–> (管理员ID,数量)
(管理员ID,存储物品ID)–>(仓库ID,数量)
所以,(仓库ID,存储物品ID)和(管理员ID,存储物品ID)都是其候选关键字,表中的唯一非关键字段为数量,它符合第三范式,但是存在如下决定关系。
(仓库ID)–> (管理员ID)
(管理员ID)–>(仓库ID)
即存在关键字段决定关键字段的关系,如果修改管理员ID,那么就必须进行逐一修改,所以其不符合BCNF范式。应该要单独新建一个表来存放其关系。