关系模式中的属性分为主键属性和非主键属性。主键属性是可以唯一标识一条记录的属性,而非主键属性则是不能唯一标识一条记录的属性。
例如,以下关系模式中,学号是主键属性,姓名和性别是非主键属性:
学号 | 姓名 | 性别 |
001 | 张三 | 男 |
002 | 李四 | 女 |
在关系模式中,属性之间可能存在函数依赖关系。函数依赖是指一个或多个属性的值可以唯一确定另一个属性的值。例如,学号可以唯一确定姓名和性别,因此学号函数依赖于姓名和性别。
函数依赖分为完全函数依赖、部分函数依赖、传递函数依赖、平凡函数依赖和非平凡函数依赖。
1. 完全函数依赖
完全函数依赖是指在一个关系模式中,如果X是候选码(即可以唯一标识一条记录的最小属性集合),Y是非主键属性,则Y完全函数依赖于X。例如,在以下关系模式中,学号是候选码,姓名和性别完全函数依赖于学号:
学号 | 姓名 | 性别 |
001 | 张三 | 男 |
002 | 李四 | 女 |
2. 部分函数依赖
部分函数依赖是指在一个关系模式中,如果X不是候选码,Y是非主键属性,则Y部分函数依赖于X。例如,在以下关系模式中,学生编号和课程编号联合才能唯一确定成绩,因此成绩部分函数依赖于学生编号和课程编号:
学生编号 | 课程编号 | 成绩 |
1001 | 0001 | 80 |
1001 | 0002 | 90 |
1002 | 0001 | 85 |
3. 传递函数依赖
传递函数依赖是指在一个关系模式中,如果X→Y,Y→Z,但X不能→Z,则称Z传递函数依赖于X。例如,在以下关系模式中,学生编号可以唯一确定班级编号,班级编号可以唯一确定班主任姓名,因此班主任姓名传递函数依赖于学生编号:
学生编号 | 班级编号 | 班主任姓名 |
1001 | 01 | 张三 |
1002 | 02 | 李四 |
1003 | 01 | 张三 |
4. 平凡函数依赖
平凡函数依赖是指在一个关系模式中,如果Y是X的子集,则称Y对X有平凡函数依赖。例如,在以下关系模式中,学号对姓名和性别有平凡函数依赖:
学号 | 姓名 | 性别 |
001 | 张三 | 男 |
002 | 李四 | 女 |
5. 非平凡函数依赖
非平凡函数依赖是指在一个关系模式中,如果Y不是X的子集,则称Y对X有非平凡函数依赖。例如,在以下关系模式中,学号对姓名和性别有非平凡函数依赖:
学号 | 姓名 | 性别 |
001 | 张三 | 男 |
002 | 李四 | 女 |
以上就是主键属性和非主键属性以及完全函数依赖、部分函数依赖、传递函数依赖、平凡函数依赖和非平凡函数依赖的详细解释。
下面是关系模式的规范化
关系模式的规范化是指将一个不符合某种范式要求的关系模式,通过分解操作转化为若干个符合要求的关系模式的过程。常见的关系模式范式有第一范式、第二范式、第三范式和BC范式。
1. 第一范式(1NF)
第一范式要求关系模式中的所有属性都是不可再分的原子值。也就是说,每个属性都应该是一个单一的值,不能再分解成更小的数据单元。例如,一个订单表中的商品名称和商品数量不能合并在一起作为一个属性。
例如,以下关系模式不符合第一范式:
订单编号 | 商品信息 |
1001 | 鞋子,2 |
可以将其规范化为两个关系模式:
订单编号 | 商品编号 | 商品数量 |
1001 | 001 | 2 |
商品编号 | 商品名称 |
001 | 鞋子 |
2. 第二范式(2NF)
第二范式要求关系模式中的非主键属性必须完全依赖于主键,而不能只依赖于主键的一部分。也就是说,一个关系模式应该只描述一个实体,而不是多个实体。
例如,以下关系模式不符合第二范式:
订单编号 | 商品编号 | 商品名称 | 商品价格 |
1001 | 001 | 鞋子 | 100 |
1001 | 002 | 衣服 | 200 |
可以将其规范化为两个关系模式:
订单编号 | 商品编号 | 商品数量 |
1001 | 001 | 2 |
1001 | 002 | 1 |
商品编号 | 商品名称 | 商品价格 |
001 | 鞋子 | 100 |
002 | 衣服 | 200 |
3. 第三范式(3NF)
第三范式要求一个关系模式中不能存在非主键属性对主键的传递依赖。也就是说,如果一个非主键属性可以通过其他非主键属性推导出来,那么这个非主键属性就应该被剥离出来形成一个新的关系模式。
例如,以下关系模式不符合第三范式:
学号 | 姓名 | 年龄 | 学院编号 | 学院名称 |
10001 | 张三 | 20 | 01 | 计算机学院 |
10002 | 李四 | 21 | 02 | 管理学院 |
10003 | 王五 | 22 | 01 | 计算机学院 |
可以将其规范化为两个关系模式:
学号 | 姓名 | 年龄 | 学院编号 |
10001 | 张三 | 20 | 01 |
10002 | 李四 | 21 | 02 |
10003 | 王五 | 22 | 01 |
学院编号 | 学院名称 |
01 | 计算机学院 |
02 | 管理学院 |
01 | 计算机学院 |
4. BCNF
BCNF(Boyce-Codd)范式要求一个关系模式中的每个依赖都是由候选键决定的。如果存在不符合这种要求的依赖,则需要将其拆分出来形成新的关系模式。
例如,以下关系模式不符合BCNF:
员工编号 | 员工姓名 | 部门编号 |
E001 | 张三 | D001 |
E002 | 李四 | D002 |
其中,部门编号依赖于员工编号和员工姓名,而不是只依赖于员工编号。可以将其规范化为两个关系模式:
员工编号 | 员工姓名 |
E001 | 张三 |
E002 | 李四 |
员工编号 | 部门编号 |
E001 | D001 |
E002 | D002 |
以上,就是关系模式规范化的详细解释。关系模式规范化可以帮助我们减少数据冗余和数据异常,提高数据库的性能和数据质量。
如果大家看了还是不太能理解的,建议马上去做做题,我最开始看了好几遍总是看了忘忘了看,但是题做多了反而就熟悉了。