数据库三大范式
第一范式(1NF):
是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
个人总结:
不能有表中表。
如数据表不能这样设计,因为数据表的一个二维表:
姓名 | 思想道德素质测评(20%) | 专业素质测评(60%) | |||||||||
基础分 | 奖励分 | 惩罚分 | 最后得分 | 排名 | 必修课成绩 | 奖励分 | 惩罚分 | 最后得分 | 排名 | ||
得分 | 排名 | ||||||||||
张三 | 78 | 0 | 0 | 78 | 2 | 71.7 | 1 | 0 | 0.0 | 71.7 | 1 |
王五 | 78 | 0 | 0 | 78 | 2 | 71.3 | 24 | 0.0 | 0.0 | 71.3 | 2 |
李四 | 78 | 0 | 0 | 78 | 2 | 70.8 | 25 | 0.0 | 2.0 | 68.8 | 3 |
而这样设计是可以的:
姓名 | C语言 | java | MySQL | Oracle |
张三 | 78 | 88 | 68 | 78 |
王五 | 78 | 55 | 87 | 78 |
李四 | 78 | 86 | 91 | 56 |
第二范式(2NF):
要求数据库表中的每个实例或行必须可以被惟一地区分,数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
个人总结:
非主属性依赖于主属性
如以下成绩表
student_id | course_id | grade | birthday |
20101661 | 1 | 56 | 1991,07,14 |
20101662 | 3 | 58 | 1993,7,25 |
这样设计不行,因为grade完全依赖于主码student_id、course_id,而birthday只依赖于部分主码student_id。所以要将其拆分成两个表
student(student_id, birdthday);
grade(student_id, course_id, birthday);
course_id为联系student表的外键
第三范式(3NF):
要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
个人总结:
不能有传递性
如以下表
student_id | course_id | birthday | SD(所在系的名称) | SL(所在宿舍楼) |
20101661 | 1 | 1991,07,14 | 软件学院 | 1栋 |
20101662 | 3 | 1993,7,25 | 经管学院 | 2栋 |
student_id为主码,SL依赖于student_id,但可以从非主码属性SD导出,即知道了SD,也就知道了SL。可以奖这个表拆分成两个表,如下:
grade(student_id, course_id,SD);
department(SD, SL);
SD为 联系 grade表的主键
数据库的存储方式
顺序存放,平均查询次数为关系的记录个数的1/2;
杂凑存入,平均查询次数由杂凑算法决定;
索引存放,要确定建立何种索引,及建立索引的表和属性;
聚簇存放,记录聚簇是指将不同类型的记录分配到相同的物理区域中,以充分利用顺序性的优点,提高访问速度。