java面试题之三大范式

面试失败第二次

三大范式

 

第一范式(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的要求。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值