关系型数据库设计
六大范式
第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、
第四范式(4NF)和第五范式(5NF,又称完美范式)。
第一范式
数据库表的每一列都是不可分割的原子数据项,而不是数组、集合。即实体中的某个属性有多值
时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个
属性的一部分。简而言之,第一范式就是无重复的域。
第二范式
建立在第一范式的基础上,第二范式要求数据库表中的每个实例或记录必需可以被唯一的区分
选取一个能区分每个实体的属性或属性组作为实体的唯一标识,例如在员工表中的身份证号码即可实
现每个一员工的区分,该身份证号码即为候选键,任何一个候选键都可以被选作主键。(该主键的添
加是在ER设计时添加,不是建库时随意添加)
第二范式要求属性完全依赖于主关键字,而不能存在任何一列和主键没有关系
第三范式
第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式
(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信
息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信
息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入
员工信息表中。
第三范式要求表中的每一列都要与主键直接关联,而不是间接关联
什么是主键
在一张表中,用来唯一标识一条记录的字段集,叫做主关键字或者主关键码,简称主键(或主码),
这里说"字段集"是因为主键可能用一个字段或者多个字段来表示
什么是外键
一张表的非主属性是另一个表的主属性就是这个表的外键。这里有两个分别为: 学生表(学
号, 姓名, 性别,专业编号),专业信息表(专业编号,专业名称,专业备注信息)。学生表
中主键是学号,专业信息表中主键是专业编号。学生表中的非主属性专业编号恰好是专业信息表中的
主键。我们就称这个专业编号是学生表的外键。像这样,一个表的非主属性是另一个表的主属性,该
非主属性就是外键。
父表和子表
有两张表,一张表中的外键是另一张表的主键时,外键的那张表称之为字表,另一张表就是父
表,以上面的学生表和专业信息表为例,学生表的外键专业编号是专业信息表的主键,那么学生表
是字表,专业信息表是父表。
应用实例
学生系统的设计
确定要设计的内容
- 学生有那些基本信息?
- 学生选了那些课,成绩是什么?
- 每个课的学分是多少?
- 学生属于那个系,系的基本信息是什么?
首先先把所有属性放在一张表中,看有什么结果
(学号,学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话)
(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
不符合第二范式的要求
数据冗余
数据修改困难
解决:
设计四张表:
- 学生信息表(学号,姓名,年龄,性别,系别);
- 课程表 (课程名称,学分)
- 选课关系表 (学号,课程名称,成绩)
- 系别关系表(系别,系办地址、系办电话)。
数据库约束
五大约束:
- 主键约束(Primay Key Coustraint) 唯一性,非空性;
- 唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个
- 默认约束 (Default Counstraint) 该数据的默认值;
- 外键约束 (Foreign Key Counstraint) 需要建立两表间的关系;
- 非空约束(Not Null Counstraint):设置非空约束,该字段不能为空。