面试失败第二次
三大范式
第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;
如:一张表里的地址、电话。
第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;
如:订单表只描述订单相关的信息,所以所有字段都必须与订单id相关;产品表只描述产品相关的信息,所以所有字段都必须与产品id相关;因此不能在一张表中同时出现订单信息与产品信息;
第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);
例如:订单表中需要有客户相关信息,在分离出客户表之后,订单表中只需要有一个用户id即可,而不能有其他的客户信息。因为其他的客户信息直接关联于用户id,而不是直接与订单id直接相关。
2020.5.27号新的通俗理解
第二范式:在第一范式的基础上,要求非主属性对主属性是完全函数依赖,即不存在部分函数依赖。
举个例子:学生成绩表这样一个关系sc(sno,sname,cno,cname,grade),对于这样一个关系是不满足第二范式的,怎么说,首先分析出主属性,即学号sno和课程号cno,其他属性均为非主属性,再看学生姓名sname这个非主属性,很显然只依赖于sno就可以确定,不依赖cno而确定,所以这样一个关系存在部分依赖,故不满足第二范式。
第三范式(3NF)
3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说, 如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。
对于上图,主码为(学号,课名),主属性为学号和课名,非主属性只有一个,为分数,学号不能直接找到分数,课名也不能直接找到分数,不可能存在传递函数依赖,所以选课表的设计,符合3NF的要求。
对于学生表,主码为学号,主属性为学号,非主属性为姓名、系名和系主任。因为 学号 → 系名,同时系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖,所以学生表的设计,不符合3NF的要求。。