暑期自学 Day 12 | 数据库 (五)- 多表,数据库设计
多表关系
- 一对一:人和身份证
- 一对多:部门和员工:一个部门,多个员工
- 多对多:学生和课程
一对一
- 可以在任一方添加唯一外键指向另一方主键
- 一般一对一关系合并成一张表
一对多
- 建立关联:在多的一方建立外键,指向一的一方的主键
- 如:在员工表建立外键,指向部门的主键
多对多
- 建立关联:需要中间表,中间表至少包含两个字段–两张表的主键。中间表的联合主键需要唯一。
- 一个例子:
# 中间表 CREATE TABLE middle ( rid INT, -- 表一主键 uid INT, -- 表二主键 PRIMARY KEY (rid, uid), -- 联合主键 FOREIGN KEY (rid) REFERNCE user(uid), FOREIGN KEY (uid) REFERNCE route(rid) );
数据库设计范式
遵从后面的范式要求,必须先遵从前面的范式要求。
第一范式
每一列都是不可分割的原子数据项。
就是说不能有某一列还包含一个或者多个子列。
第二范式
第一范式基础上,非码属性必须完全依赖于候选码(消除第一范式基础上的部分依赖)
- 函数依赖:通过A属性或(A1,A2)属性组的值可以确定B属性的值,A->B。
- 学号->姓名,(学号,课程)->成绩
- 完全函数依赖:确定B属性的值需要依赖于A属性组中所有属性的值。
- (学号,课程)->成绩
- 部分函数依赖:确定B属性的值只需要依赖于A属性组中某一些属性的值。
- (学号,课程)->姓名
- 传递函数依赖:A->B,B->C.
- 学号->系名->系主任
- 码:一个属性或者主属性被其他所有属性完全依赖。
- 主属性:码的属性组中的属性
- 非主属性:除了码之外的所有属性
第三范式
任何非主属性不依赖于其他非主属性
- 如:”学号,姓名,系,系主任” 表中,系主任依赖于系名,而系和系主任在这个表中都是非主属性,所以这个表的设计不合理。
本作品采用《CC 协议》,转载必须注明作者和本文链接