设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系型数据库有六种范式,第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(完美范式)。
第一范式:保证每列的原子性
第一范式是最基本的范式,如果数据库表中所有的字段值都是不可分割的原子值,则满足第一范式。
如:家庭住址为**省**市**区,在数据库中单独设一个字段表示地址,但这是不满足第一范式基本要求的,因为如果经常访问地址中的城市,那就需要将省份,市,区进行单独存储,这样对地址中某一部分操作就会方便,满足每个字段都是不可分割的原子值
第二范式:保证一张表只描述一件事情
在满足第一范式的基础上,数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖
这张表满足第一范式,每个字段不可再分,但这张表描述了两件事情,学生信息和课程信息,学分完全依赖于课程名称,姓名和年龄完全依赖于学号,这样不好的后果是:
1.数据冗余:同一门课程由n个学生选修,学分重复n-1次,同一学生选修m门课程,姓名和年龄重复m-1次
2.更新异常:若调整了某门课程的学分,数据表中的所有行的“学分”都要更新,否则会出现同一门课程学分不同的情况
3.插入异常:假设要开设一门新课程,暂时没有人选修,由于没有“学号”关键字,课程和学分也无法录入数据库
4.删除异常:假设一批学生已经完成了课程的选修,这些选修记录就应该从数据库表中删除,但是删除的同时,“课程”和“学分”也被删除了,显然不合适,可以修改如下:
增加了表,将学生信息和课程信息加了一张关联表,这就是第二范式的中心:保证一张表只讲一件事
第三范式:保证每列都和主键直接相关
数据库表中如果不存在非关键字段任一候选关键字段的传递函数依赖,则符合第三范式。就是如果存在“A-->B-->C”的决定关系,则C传递函数依赖于A,表中的字段和主键直接对应不依靠其他中间字段,,就是只有主键决定某字段值
如下:
这张表中可以看出,“姓名”,“”年龄,“学院”和主键“学号”是直接关联的 ,但是“学院地点”和“学院电话”却不是和主键直接关联的,和他们关联的是“学院”,这样同样会造成和第二范式一样的数据冗余、插入异常、更新异常、删除异常的问题。
可以修改为如下结构: