关系型数据库
2021-06-15 本文已影响0人
Vergil_wj
关系
表和表之间的联系。
实现方式
通过设置不同形式的外键来体现表和表的不同关系。
分类
- 一对一关系;
- 一对多关系;
- 多对多关系;
一对一
夫妻关系,一夫一妻。
因为是一对一,完全可以将表 A 和表 B 合为一张表。
或者用表A的主键充当表B的外键,也可表B的主键充当表A的外键。
一对多
组织架构,一个上级对应多个下级。
把表A 的主键充当B的外键。在多的一方添加外键。
多对多
老师和学生的关系。一个老师带多个学生,一个学生由多个老师教课。
多对多必须通过第三张单独的一张表来表示。
例如:班级一张表,教师一张表,班级和教师的关系一张表。
班级:
编号 | 人数 | 班级名称 |
---|---|---|
1 | 20 | 一班 |
2 | 30 | 二班 |
教师:
编号 | 姓名 |
---|---|
10001 | aa |
10002 | bb |
第三张表:
班级编号 | 教师编号 | 课程 |
---|---|---|
1 | 1001 | sql |
1 | 1002 | java |
2 | 1001 | c |
-
假设每个老师只教一门课程,则主键的设置为:编辑编号 + 教师编号
假设每个老师可以教多门课程,则主键的设置为:编辑编号 + 教师编号 + 课程 -
第三张表中班级编号是班级表的外键,教师编号是教师表的外键。
代码实现:
-- 班级
create table banji
(
banji_id int primary key,
banji_num int not null,
banji_name nvarchar(100)
)
-- 教师
create table teacher
(
teacher_id int primary key,
teacher_name nvarchar(100)
)
-- 第三张表,模拟班级和教师的关系
create table banji_teacher_mapping
(
banji_id int constraint fk_banji_id foreign key references banji(banji_id), -- 设置成外键,来自于 banji 表
teacher_id int foreign key references teacher(teacher_id), -- 外键,来自于teacher 表
kecheng nvarchar(20),
constraint pk_banji_id_teacher_id primary key (banji_id,teacher_id) -- 设置 banji_id 和 teacher_id 的组合为主键
)