实体间的联系有:一对一、一对多和多对多。
1.一对一联系
注:每表中必须设置主键,为实现一对一的联系,需将参照属性定义为唯一性约束。
1.1第一种方法:将联系转换为一个独立的关系模型(即表)。
其属性构成是由相连各实体的码和联系本身的属性构成。
1.2第二种方法:将联系与实体的任意一端合并。
其属性构成是另一关系的码和联系本身的属性。
2.一对多的联系
第一种方法:转化为一个独立的关系模式,由相连实体的码和联系本身的属性构成。
第二种方法:与多端关系模式合并,加入另一关系模式的码和联系本身的属性。
3.多对多
1.转化为一个独立关系模式,属性构成是 相连各实体的码和本身的属性构成。
注:多对多总是转化为两个一对多
以一对一为例
例:部门表(部门编号,部门名称),部门经理表(经理编号,姓名),部门与部门经理之间存在一对一关系,联系为:任职。如下图:
用第一种方法实现:将联系转换为一个独立的关系模型(即表)即创建三个表,两个实体表和一个关系表
create database 练习
on
(
--逻辑文件名
name=练习,
--物理文件名
filename='e:\数据库\练习\练习.mdf',--mdf数据库文件
--文件的大小
size=10MB,
--文件的增长方式
filegrowth=10%,
--文件最大值
maxsize=100MB
)
log on
(
--逻辑文件名
name=mydb_log,
--物理文件名
filename='e:\数据库\练习_log.ldf',--ldf 数据库日志文件
--文件的大小
size=10MB,
--文件的增长方式
filegrowth=10%,
--文件最大值
maxsize=100MB
)
GO
use 练习
create table 部门
(
部门编号 char(20) ,
部门名称 char(20)
)
alter table 部门
alter column 部门编号 char(20) not null
alter table 部门
add constraint pk_部门编号 primary key (部门编号)
create table 部门经理
(
经理编号 char(20) ,
经理姓名 char(20)
)
alter table 部门经理
alter column 经理编号 char(20) not null
alter table 部门经理
add constraint pk_经理编号 primary key(经理编号)
create table 任职
(
部门编号 char(20) ,
经理编号 char(20) ,
任职时间 datetime
)
alter table 任职
alter column 部门编号 char(20) not null
alter table 任职
alter column 经理编号 char(20) not null
alter table 任职
add constraint pk_部门编号_经理编号 primary key(部门编号,经理编号)
alter table 任职
add constraint UQ_部门编号 unique (部门编号)
alter table 任职
add constraint UQ_经理编号 unique (经理编号)
alter table 任职
add foreign key(部门编号) references 部门(部门编号)
alter table 任职
add foreign key(经理编号) references 部门经理(经理编号)
用第二种方法实现:将联系与实体的任意一端合并。即建两个表,其中一个的属性构成是另一关系的码和联系本身的属性。
create table 部门
(
部门编号 char(20) ,
部门名称 char(20)
)
alter table 部门
alter column 部门编号 char(20) not null
GO
alter table 部门
add constraint pk_部门编号 primary key (部门编号)
create table 部门经理
(
经理编号 char(20) ,
经理姓名 char(20),
部门编号 char(20),
任职时间 datetime
)
alter table 部门经理
alter column 经理编号 char(20) not null
alter table 部门经理
alter column 部门编号 char(20) not null
GO
alter table 部门经理
add constraint pk_经理编号 primary key(经理编号,部门编号)
alter table 部门经理 add foreign key(部门编号) references 部门(部门编号)