数据库-2
SQL 第一范式、第二范式、第三范式、BCNF
第一范式 1NF
要求:每一个分量必须是不可分的数据项。
特点:
- 有主键,且主键不能为空。
- 字段不能再分。
示例:(以下例子 不满足 第一范式)
1 | /*学号 年龄 信息*/ |
主键:Sno
不满足原因:
- 主键重复。
- Sinfo字段可以再分。
第二范式 2NF
要求:在范式一的基础上,且每一个非主属性完全函数依赖于码。
特点:
- 满足第一范式。
- 表中的每一个非主属性,必须完全依赖于本表码。
- 只有当一个表中,主码由两个或以上的属性组成的时候,才会出现不符合第二范式的情况。
示例:(以下例子 不符合 第二范式)
1 | /*学号 课程号 得分 课程名*/ |
主键: Sno,Cno
不满足原因:Sname不完全依赖于码,课程名部分依赖于码Cno。
第三范式 3NF
要求:在满足第二范式的基础上,且每一个非主属性既不部分依赖于码也不传递依赖于码。
特点:
- 满足第二范式。
- 非主属性不能传递依赖于码。
示例:(以下例子 不符合 第三范式)
1 | /*学号 系别 系主任*/ |
主键:Sno
不满足原因:Shead传递依赖于码,Sno->Sdept->Shead,可得Sno->Shead。
BCNF
要求:在满足第三范式的基础上,且不允许主键的一部分被另一部分或其它部分决定。
特定:
- 满足第三范式。
- 所有非主属性对每一个码都是完全函数依赖。
- 所有的主属性对每一个不包含它的码,也是完全函数依赖。
- 没有任何属性完全函数依赖于飞码的任何一组属性。
示例:(以下例子 不符合 第BCNF范式)
1 | /*学生 老师 课程*/ |
假设:每个老师只教一门课。
候选码:
- (Stu,Teacher)->Course
- (Stu,Course)->Teacher
这两个码由两个属性组成,而且它们是相互交叉的,所以不存在传递依赖,所以为3NF。
但是由于:Teacher->Course,(主键的一部分被另一部分决定),所以不符合BCNF。