关系定义:
表和表之间的联系
实现形式:
通过设置不同形式的外键来体现表和表的不同关系
分类:(假设A表和B表)
一对一
既可以把表A的主键充当表B的外键
也可以把表B的主键充当表A的外键
一对多
把A表的主键添加到B表的外键
或者讲:把a表的主键添加到B表来充当B表的外键
通俗的说就是:在多的一方添加外键。(如下图)
多对多
多对多必须通过单独的一张表来表示,即通过第三张表来表示A表和B表之间的关系。
例如:
班级和老师的关系
老师和学生之间的关系
在关系表中:
1班和2班均有王老师上课,实现了从表A到表B的多对一关系
1班有两个老师给其上课,实现了从A表到B表的一对多关系
王老师给1班和2班上课,实现了从B表到A表的一对多关系
王老师和赵老师都给1班上课,实现了从B表到A表的多对一的关系。
从而实现了整体上多对多的关系。
在关系表中,要想表现班级信息和教师信息两个表格的关系,至少需要“班级id”和“教师id”两个字段。才能说明两个表的之间多对多的关系,但是为了具体的说明,我加上了“授课课程”字段和教师信息字段
那么在关系表中,如何选取主键呢?首先根据选取主键的目的——不允许重复元素,避免数据冗余可知,班级id字段、教师id字段、教师姓名字段和授课课程字段均不可单独作为主键。所以我们就需要将这几个字段看成一个整体,然后定义为字段,如下图。为了防止在关系表中班级id和教师id字段中写的编号并没在班级信息和教师信息表中出现过,这时就需要将这两列设置为外键。
多对多关系代码实现
--班级表
create table banji
(
banji_id int primary key,
banji_num int not null,
banji_name nvarchar(100),
)
--教师
create table jiaoshi
(
jiaoshi_id int primary key,
jiaoshi_name nvarchar(100)
)
--第三张表,用来描述模拟班级和教师的关系
create table banji_jiaoshi_mapping
( --本表有且只有一个主键,外键有两个:banji_id,jiaoshi_id
banji_id int constraint fk_banji_id foreign key references banji(banji_id),
-- 上面一行中(从左到右):banji_id表示字段名,constraint表示约束,fk_banji_id表示此字段的约束名(可省略),references banji(banji_id)表示约束来自那个表的那个表的那个字段
jiaoshi_id int foreign key references jiaoshi(jiaoshi_id),
kecheng nvarchar(20),
constraint pk_banji_id_jiaoshi_id primary key (banji_id,jiaoshi_id,kecheng)
--constraint表示强制约束
--pk_banji_id_jiaoshi_id为约束名
-- (banji_id,jiaoshi_id,kecheng)表示将三个字段建成一个字段,在这样的定义情况下,我们的第三张表中,每条记录不能完全重复,否则违反主键规则
)