第一范式:数据表的列不可再分
eg:看下面数据表,对于选课列明显是可以再分的,所以它是违反第一范式的。
+-------------------------------+
|学号 |姓名 |选课 |
|-------+------+----------------|
|10001 |张三 |数学,语文,英语|
|-------+------+----------------|
|10002 |李四 |语文,英语 |
|-------+------+----------------|
|10003 |王五 |语文,英语,历史|
+-------------------------------+
第二范式:在满足第一范式的基础上,表中的非主键列不存在对主键的部分依赖
也就是受非主键列必须全部依赖于主键,通过主键可以唯一标识非主键列
看下面的学生选课表:
+---------------------------+
|学号 |课程 |成绩 |课程学分|
|------+-----+-----+--------|
|10001 |数学 |100 |6 |
|------+-----+-----+--------|
|10001 |语文 |90 |2 |
|------+-----+-----+--------|
|10001 |英语 |85 |3 |
|------+-----+-----+--------|
|10002 |数学 |90 |6 |
|------+-----+-----+--------|
|10003 |数学 |99 |6 |
|------+-----+-----+--------|
|10004 |语文 |89 |2 |
+---------------------------+
表中主键为 (学号,课程),我们可以表示为(学号,课程)->(成绩,课程学分),
表示所有非主键列 (成绩,课程学分)都依赖于主键 (学号,课程)。 但是,表中
还存在另外一个依赖:(课程)->(课程学分)。这样非主键列 ‘课程学分’依赖于部分主键列 ‘课程’, 所以上表是不满足第二范式的。
我们把它拆成如下2张表:
学生选课表:
+-----------------+
|学号 |课程 |成绩|
|------+-----+----|
|10001 |数学 |100 |
|------+-----+----|
|10001 |语文 |90 |
|------+-----+----|
|10001 |英语 |85 |
|------+-----+----|
|10002 |数学 |90 |
|------+-----+----|
|10003 |数学 |99 |
|------+-----+----|
|10004 |语文 |89 |
+-----------------+
课程信息表:
+-------------+
|课程|课程学分|
|----+--------|
|数学| 6 |
|----+--------|
|语文| 3 |
|----+--------|
|英语| 2 |
+-------------+
那么上面2个表,学生选课表主键为(学号,课程),课程信息表主键为(课程),
表中所有非主键列都完全依赖主键。不仅符合第二范式,还符合第三范式。
再看这样一个学生信息表:
+--------------------------------+
|学号 |姓名 |性别 |班级|班主任|
|------+-------+-----+----+------|
|10001 |张三 |男 |一班|小王 |
|------+-------+-----+----+------|
|10002 |李四 |男 |一班|小王 |
|------+-------+-----+----+------|
|10003 |王五 |男 |二班|小李 |
|------+-------+-----+----+------|
|10004 |张小三 |男 |二班|小李 |
+--------------------------------+
上表中,主键为:(学号),所有字段 (姓名,性别,班级,班主任)都依赖与主键(学号),不存在对主键的部分依赖。所以是满足第二范式.
第三范式:在满足第二范式的基础上,表中不存在对主键的传递依赖对于上面的学生信息表,虽然满足第二范式,所有字段都依赖主键(学号),但是,表中存在一个传力依赖,(学号)->(班级)->(班主任)。也就是说,(班主任)这个非主键列依赖与另外一个非主键列(班级)。所以不符合第三范式。把这个表拆分成如下2个表,
学生信息表:
+----------------------+
|学号 |姓名 |性别|班级|
|-----+------+----+----|
|10001|张三 |男 |一班|
|-----+------+----+----|
|10002|李四 |男 |一班|
|-----+------+----+----|
|10003|王五 |男 |二班|
|-----+------+----+----|
|10004|张小三|男 |二班|
+----------------------+
班级信息表:
+-----------+
|班级|班主任|
|----+------|
|一班|小王 |
|----+------|
|二班|小李 |
+-----------+
这样,对主键的传递依赖就消失了。上面的2个表都符合第3范式。