第一范式:消除组中的重复,也就是说列中是否存储了其他列中的信息
第二范式:消除部分依赖列,也就是说是否有依赖于一部分主键的列
第三范式:消除非依赖列,是否有依赖于非主键的列
例如:
学生信息表
学生ID,姓名,地址,城市,邮政编码,所在年级,性别,参加课程,课程级别,课程ID,名称,描述,教师ID,教
师姓名,时间表,地点,先决课程
如果这么多字段在同一个表里,那么这种设计会被认为没有正规化,这里有很多重复的信息,为了把数据库设计转化
为第一范式,需要把信息分成两个表,并在两个表之间建立关系,如下:
学生表
学生ID,姓名,地址,城市,邮政编码,所在年级,性别
学生课程表
学生ID,课程ID,名称,描述,教师ID,教师姓名,时间表,地点
通过把学生从课程中分离,我们可以消除由不同的逻辑组引入的重复,我们必须满足消除信息重复的目标。接下来,
从第一范式到第二范式,我们需要消除表中仅仅部分依赖主键的列,这些列应该被分割到不同的表中。在学生课程表
中,许多列仅仅依赖于课程ID,而不依赖于学生ID,这个表的主键是学生ID+课程ID,因此把这个表分成两个表,如下
:
学生课程表
学生ID,课程ID,课程级别
课程表
课程ID,名称,描述,教师ID,教师姓名,先决课程,时间表,地点
既然对主键的部分依赖已经消除,数据库就已经满足第二范式了。为了进一步把数据库转化为第三范式,需要把表中
对构成主键的列的不依赖部分分离出去,教师姓名依赖于教师ID,而不依赖于课程ID,索引,这些列应该被分离以形
成一个新表,如下:
教师表
教师ID,教师姓名
最终的课程表如下
课程ID,名称,描述,教师ID,时间表,地点
一旦所有的数据库的设计依赖性都被消除,也就满足了第三范式。
不一定每种数据库设计都要达到第三范式,因为达到第三范式在查询的时候进行大量的连接操作,所以要针对你的情况设计你的数据库。
都是我一个字一个字敲的,好累,希望对你有些帮助,;)