范式:判断所建表是否合理的规范方法
[1].第一范式(1NF)
错误的表:
学生表 | |||
姓名 | 性别 | 年龄 | 班级 |
张三 | 男 | 20 | 二班 |
张三 | 男 | 20 | 二班 |
问题:相同姓名的张三的两条记录不能被计算机区别,计算机必须要能区别每一行?
解决:添加标识属性,也就主键。
正确的表:
学生表
学号 | 姓名 | 性别 | 年龄 | 班级 |
1 | 张三 | 男 | 20 | 二班 |
2 | 张三 | 男 | 20 | 二班 |
错误的表:
学生表
学号 | 学生信息 |
1 | 张三丰,男,20 |
2 | 李四,20,男 |
问题:如果查找男学生的信息,计算机需要分割记录,查找很吃力?
解决:每个行的每个列必须具有原子性,也就是每个列的信息不可再分。
正确的表:
学生表
学号 | 姓名 | 性别 | 年龄 |
1 | 张三丰 | 男 | 20 |
2 | 李四 | 男 | 20 |
注意:每个列的信息不可再分,意思是要相对独立。
例如:地址可按下列两种方式存储
1.
地址 |
成都市XX区YY街99号 |
2.
市 | 区 | 街 | 号 |
成都 | XX | YY | 99 |
如果只是简单记录地址的信息,地址不需分开。
如果要按市、区、街查询统计,地址则要分开。
问题:表中每个行的列数要一样?
解决:数据库中的表一定都满足此条件。
1NF小结:
1.不能将很多信息保存到一个字段。
2.必须要主键列。
3.每一行的属性必须相同。
[2].第二范式(2NF)
错误的表:
学生表
学号 | 姓名 | 性别 | 年龄 | 班级 |
1 | 张三 | 男 | 20 | 一班 |
2 | 张三 | 男 | 20 | 一班 |
PK列:主键列,如学号。
非PK列:非主键列,如姓名,性别,年龄,班级。
问题:非PK列必须依赖于PK列。
在上表中,PK列是学号,学号代表了一个实体(一个具体的学生对象),其属性必须是这个实体本身的属性,班级就不是学生本身的属性。解决:划分出实体与关系。
学生在那个班级,这不是在问实体,而是再问关系。
正确的表:
学生表
学号 | 姓名 | 性别 | 年龄 | 班级编号 |
1 | 张三 | 男 | 20 | 1 |
2 | 张三 | 男 | 20 | 1 |
班级表
班级编号 | 名称 | 开班日期 |
1 | 一班 | 2002-1-2 |
2 | 二班 | 2002-1-2 |
2NF小结:强迫划分出实体与关系。
[3].第三范式(3NF)
错误的表:
学生表
学号 | 姓名 | 性别 | 年龄 | 出生日期 | 生肖 |
1 | 张三 | 男 | 20 | yy-mm-dd | 狗 |
2 | 张三 | 男 | 20 | yy-mm-dd | 狗 |
问题:非PK列之间必须相互独立,相互没有关系。
上表中生肖与出生日期有关。
解决:建立新表,通过外键引用主键。
建立生肖表。
正确的表:
生肖表 | |
编号 | 名称 |
1 | 狗 |
2 | 猪 |
学生表
学号 | 姓名 | 性别 | 年龄 | 出生日期 | 生肖编号 |
1 | 张三 | 男 | 20 | yy-mm-dd | 1 |
2 | 张三 | 男 | 20 | yy-mm-dd | 1 |
范式总结:
共有5个范。
常用以上3个范式。
1NF,2NF必须满足,3NF可以不满足,但尽量满足。