一、一对多关系
比如专业表和学生表,一个专业对应多个学生
create table Profession --专业表
(
ProId int primary key identity(1,1),--专业编号
ProName varchar(50) not null--专业名称
)
create table Student
(
ProId int not null FOREIGN KEY REFERENCES Profession(ProId),--专业编号(此字段用于关联专业表)
StuId int primary key identity(1,1),--学生编号
StuName varchar(10) not null,--学生姓名
StuSex varchar(10) not null--学生性别
)
insert into Profession(ProName) values('软件工程')
insert into Profession(ProName) values('计算机科学与技术')
insert into Student(ProId,StuName,StuSex) values(1,'张三','男')
insert into Student(ProId,StuName,StuSex) values(1,'李四','女')
insert into Student(ProId,StuName,StuSex) values(2,'王五','男')
insert into Student(ProId,StuName,StuSex) values(2,'赵六','男')
select * from Profession
select * from Student
通过查询结果,可以很容易判断出来
一个专业对应多个学生(一对多)
这种一对多的关系做法也很简单,就是在多的表(比如这里的学生表)里面添加一个字段,然后和一的表(比如这里的专业表)进行关联即可。我们这里采用的是学生表的专业编号和专业表的专业标号进行关联(这里学生表的专业编号是一个外键)
二、一对一关系
我个人的理解是这样的:一对多关系是包含一对一关系的
什么意思?我一对多里面,那个多的表(比如上面讲的学生表),
如果我能保证一个专业只有一个学生,那就是一对一。
我们再来看看一对一关系的举例
比如学生基本信息表(学号、姓名、性别)和学生详情信息表(电话、邮箱、地址)
学生的一条基本信息就对应学生的一条详情信息(一对一)
create table StudentBasicInfo(--学生基本信息
StuNo varchar(10) primary key not null,--学号
StuName varchar(10) not null,--性别
StuSex nvarchar(1) not null--性别
)
create table StudentDetailInfo --学生详情信息
(
StuNo varchar(20) primary key not null,
StuQQ varchar(20),--QQ
StuPhone varchar(20),--电话
StuMail varchar(100),--邮箱
StuBirth date --生日
)
这里的学号StuNo我没有自动编号的原因是这样的:
因为我们这里是1对1的关系。假如现在学生基本信息里面有3个学生,对应的学生编号为1,2,3
当我们填详情信息表的时候,如果1学生的详情资料还不知道,导致详情资料无法填写,但是2和3没有问题,那我详情资料表里面可以先把1略过先弄2和3.
ps:这两个表中StuNo有一个是自动增长是可以的,两个都自动增长就很不利于维护了。
这种纯粹的一对一关系做法也很简单,让两个主键进行一个关联(两个主键相等,认为它是一对一)
三、多对多关系
什么叫多对多关系?
简单来说:正过来是一对多,反过来还是一对多
比如学生信息表和课程信息表
一个学生会学多门课程
一门课程会有多个学生学
多对多的方案:就是添加一张表,来表示这个关系
create table Student--学生
(
StuId int primary key identity(1,1),--学生编号
StuName varchar(50) not null,--学生名字
StuSex char(2) not null --学生性别
)
create table Course--课程
(
CourseId int primary key identity(1,1),--课程编号
CourseName varchar(30) not null,--课程名称
CourseContent text --课程介绍
)
--上面两张表,单独看是没有任何关联的
--为了让它们产生关联,做法就是:再添加一张表
create table Exam--考试信息表
(
ExamId int primary key identity(1,1),--选课成绩号
StuId int not null,--学生编号
CourseId int not null,--课程编号
Score int not null--考试分数
)
insert into Exam(StuId,CourseId,Score) values(1,1,90)
--编号为1的学生,参加了课程1的学习,最后课程1考了90分
insert into Exam(StuId,CourseId,Score) values(1,2,80)
insert into Exam(StuId,CourseId,Score) values(2,2,8)
我们通过上面的3张表,表达学生选课的所有逻辑:学生选课可以维护、学生信息可以维护、学生考试考了多少分也可以维护。