数据库⼀对⼀、⼀对多、多对多关系
数据库⼀对⼀、⼀对多、多对多关系
⼀、⾸先给出三种关系的实例
⼀对⼀关系实例
⼀个⼈对应⼀张⾝份证,⼀张⾝份证对应⼀个⼈
⼀对多关系实例
⼀个公司的部门拥有多个职员,⼀个职员只能够属于某个部门
多对多实例
⼀本图⽰可以拥有多个作者,⼀个作者可以写很多本书。
⼀对⼀关系
⼀对多,是最常见的⼀种设计。就是 A 表的⼀条记录,对应 B 表的多条记录,且 A 的主键作为 B 表的外键。这主要看以哪张表为中⼼。
优点
便于管理、可提⾼⼀定的查询速度
减轻 CPU 的 IO 读写,提⾼存取效率。
符合数据库设计的三⼤范式。
符合关系性数据库的特性。
缺点
增加⼀定的复杂程度,程序中的读写难度加⼤。
# 左表的⼀条记录唯⼀对应右表的⼀条记录,反之也⼀样
# ⾝份证表
create table iden(
id int primary key auto_increment,
name char(20) not null,
iden_num char(18) not null unique
);
# 公民表
create table civi(
id int primary key auto_increment,
name char(20) not null,
civi_id int unique,
foreign key(iden_id) references ident(iden_num) #外键的字段⼀定要保证unique
on delete cascade
on update cascade
)
;
⼀对多关系
⼀对多,是最常见的⼀种设计。就是 A 表的⼀条记录,对应 B 表的多条记录,且 A 的主键作为 B 表的外键。这主要看以哪张表为中⼼,我们把多对⼀和⼀对多统称为⼀对多关系,数据库中不存在多对⼀关系。
create table dep(
id int primary key auto_increment,
dep_name char(10),
dep_comment char(60)
);
create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
);
多对多关系
多对多,在数据库中也⽐较常见,可以理解为是⼀对多和多对⼀的组合。要实现多对多,⼀般都需要有⼀张中间表(也叫关联表),将两张表进⾏关联,形成多对多的形式。
create table author(
id int primary key auto_increment,
name char(16)
);
create table book(
id int primary key auto_increment,
delete inbname char(16),
price int
);
create table author2book(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);