码就是指主键
非主属性是指除了主键以外的属性
学生选课表(学生,课程,教材,老师姓名+老师职称,教室,上课时间)
(学生,课程)->教室
(学生,课程)->老师姓名+老师职称 ->主键是(学生,课程)
(学生,课程)->教材
(学生,课程)->上课时间
第一范式(1NF):属性不可分。
学生选课表(学生,课程,教材,老师姓名+老师职称,教室,上课时间)à不满足1NF
记录1(张三,java,《疯狂Java》,小白副教授,201,10点)
看“老师姓名+老师职称”这一列:小白副教授
那么就可以拆分掉,
学生选课表(学生,课程,教材,老师姓名,老师职称,教室,上课时间)->满足1NF
第二范式(2NF):符合1NF,并且,非主属性完全依赖于码。
学生选课表(学生,课程,教材,老师姓名,老师职称,教室,上课时间)->满足1NF,不满足2NF
要知道什么叫完全依赖,什么叫部分依赖
首先,找出码和非主属性
码:(学生,课程)
非主属性:(教材,老师姓名,老师职称,教室,上课时间)
部分依赖:
(学生,课程)->教材
课程->教材
(学生,课程)整体才是码,课程只是部分的码
非主属性(教材)部分依赖于码(学生,课程)
完全依赖:
(学生,课程)->教室
(学生,课程)->上课时间
学生选课表(学生,课程,教材,老师姓名,老师职称,教室,上课时间)
拆分:
学生选课表(学生,课程,老师姓名,老师职称,教室,上课时间)
课程表(课程,教材)
->满足1NF,也满足2NF
第三范式(3NF):符合2NF,并且消除传递依赖
传递依赖
首先,找出非主属性(教材,老师姓名,老师职称,教室,上课时间)
老师姓名->老师职称
非主属性(老师职称)传递依赖于非主属性(老师姓名)
学生选课表(学生,课程,老师姓名,老师职称,教室,上课时间)
课程表(课程,教材)
->满足1NF,也满足2NF
继续拆分
学生选课表(学生,课程,老师姓名,教室,上课时间)
课程表(课程,教材)
老师表(老师姓名,老师职称)
->满足1NF,满足2NF,也满足3NF