數據庫一對一、一對多、多對多關系
一、首先給出三種關系的實例
- 一對一關系實例
一個人對應一張身份證,一張身份證對應一個人
- 一對多關系實例
一個公司的部門擁有多個職員,一個職員只能夠屬於某個部門
- 多對多實例
一本圖示可以擁有多個作者,一個作者可以寫很多本書。
一對一關系
一對多,是最常見的一種設計。就是 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
);