MySQL基础关键_010_数据库设计三范式
目 录
一、概述
二、三范式
1.第一范式(必须遵循)
2.第二范式
3.第三范式
三、三范式设计
1.一对多
2.多对多
3.一对一
(1)主键共享
(2)外键唯一
一、概述
- 数据库设计三范式就是数据库表的设计原则,帮助有效、节省空间的设计表;
- 但是最终应该考虑实际需求,可能会以空间换取时间,不一定完全遵循三范式设计原则。
二、三范式
1.第一范式(必须遵循)
- 任何一张表都应该有主键;
- 每个字段是原子性的,不可再分。
2.第二范式
- 建立在第一范式基础之上;
- 所有非主键字段完全依赖主键,不能产生部分依赖。
3.第三范式
- 建立在第二范式基础之上;
- 所有非主键字段不能传递依赖于主键字段。
三、三范式设计
1.一对多
- 方案:一对多,两张表,多的表,加外键;
- 实例:表 3.1 与 表 3.2 是一对多关系,所以在 表 3.2 中添加外键。
id(primary key) | name |
---|---|
1 | 山河四省实验中学 |
2 | 山西省直属第二中学校 |
3 | 山东省直属第三中学校 |
4 | 河南省直属第四中学校 |
5 | 河北省直属第五中学校 |
id(primary key) | name | age | school_id(foreign key) |
---|---|---|---|
1101 | 王明 | 23 | 2 |
1102 | 邱钰红 | 22 | 3 |
1103 | 宋刚 | 18 | 5 |
1104 | 李志强 | 17 | 1 |
1105 | 胡建国 | 19 | 4 |
2.多对多
- 方案:多对多,三张表,关系表,加外键;
- 实例:表 3.3 与 表 3.4 是多对多关系,所以新增关系表(表 3.5),在表 3.5 中添加一个主键,两个外键。
id(primary key) | name | age |
---|---|---|
20251613001 | 赵东 | 21 |
20251613002 | 韩弘毅 | 23 |
20251613003 | 张冬雪 | 22 |
20251613004 | 郭芸 | 21 |
20251613005 | 陆洋 | 19 |
id(primary key) | name |
---|---|
1001 | 语文 |
1002 | 数学 |
1003 | 英语 |
1004 | 物理 |
1005 | 化学 |
id(primary key) | student_id(foreign key) | course_id(foreign key) |
---|---|---|
1 | 20251613001 | 1001 |
2 | 20251613001 | 1005 |
3 | 20251613002 | 1002 |
4 | 20251613002 | 1003 |
5 | 20251613003 | 1001 |
6 | 20251613003 | 1004 |
7 | 20251613004 | 1002 |
8 | 20251613004 | 1005 |
9 | 20251613005 | 1004 |
10 | 20251613005 | 1005 |
3.一对一
- 方案:
- 主键共享;
- 外键唯一。
(1)主键共享
实例:婚姻表。表 3.6 与 表 3.7 是一对一关系,所以在表 3.7 中 id 既是主键,又是外键。
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
id(primary key + foreign key) | name |
---|---|
2 | 马六 |
1 | 冯七 |
3 | 赵八 |
(2)外键唯一
实例:婚姻表。男性表与 表 3.6 相同,保持不变。对女性表进行修改,新增一列设置外键约束,保证对应 表 3.6 独一无二。
id(primary key) | name | man_id(foreign key + unique) |
---|---|---|
1 | 马六 | 2 |
2 | 冯七 | 1 |
3 | 赵八 | 3 |