-
数据库一对一、一对多、多对多关系
数据库一对一、一对多、多对多关系
一、首先给出三种关系的实例
- 一对一关系实例
一个人对应一张身份证,一张身份证对应一个人
- 一对多关系实例
一个公司的部门拥有多个职员,一个职员只能够属于某个部门
- 多对多实例
一本图示可以拥有多个作者,一个作者可以写很多本书。
一对一关系
一对多,是最常见的一种设计。就是 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, bname 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 );