数据库设计--三范式
第一范式:对属性的原子性,要求属性具有原子性,不可再分割。
create table Student--学生表 ( StuId varchar(20) primary key,--学号 StuName varchar(20) not null,--学生姓名 StuContact varchar(20) not null,--联系方式 )
insert into Student(StuId,StuName,StuAddress) values('001',N'刘备','QQ:123456789:Tel:18214920000')
select * from Student
上述设计(StuContact)不满足第一范式,联系方式一列并不是不可再分最小单元,修改如下:
create table Student--学生表 ( StuId varchar(20) primary key,--学号 StuName varchar(20) not null,--学生姓名 Tel varchar(20) not null,--联系电话 QQ varchar(20) not null,--联系QQ )
第一范式:是对记录的唯一性,要求记录有唯一标识,即实体的唯一性,不存在部分依赖。
create table StudentCourse--选课成绩表 ( StuId varchar(20) primary key,--学号 StuName varchar(20) not null,--学生姓名 CourseId varchar(20) not null,--课程编号 CourseName varchar(20) not null,--选课课程名称 CourseScore int not null,--考试成绩 )
insert into StudentCourse (StuId,StuName,CourseScore) values('001',N'刘备','001',N'语文',80)
上述设计中有两个事物,一个学生信息,一个课程信息,很明显两个事物都没有保证实体唯一性,这里姓名依赖学号,课程名称依赖课程编号,所以不符合二范式
create table Course --课程 ( CourseId int primary key identity(1,1), --课程编号 CourseName varchar(30) not null, --课程名称 CourseContent text --课程介绍 )
insert into Course(CourseName,CourseContent) values('HTML','静态网页的制作')
create table Student --学生 ( StuId int primary key identity(1,1), --学生编号 StuName varchar(30) not null, --学生名字 StuSex text --学生性别 )
insert into Student(StuName,StuSex) values('刘备','男')
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)
select Student.StuId,StuName,CourseName,Score from Student inner join Exam on Student.StuId = Exam.ExamId inner join Course on Course.CourseId =Exam.CourseId
第三范式:要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖。
create table Student ( StuId varchar(20) primary key,--学号 StuName varchar(20) not null, --学生姓名 ProfessionalId int not null, --专业编号 ProfessionalName varchar(50), --专业名称 ProfessionalRemark varchar(200), --专业介绍 )
insert into Student(StuId,StuName,ProfessionalId,ProfessionalName,ProfessionalRemark) values('001','刘备',1,'计算机','黄昏专业')
上述设计专业名称字段和专业介绍字段,在数据库会产生很多冗余数据,不满足第三范式
优化如下:
create table Professional ( ProfessionalId int primary key identity(1,1), --专业编号 ProfessionalName varchar(50), --专业名称 ProfessionalRemark varchar(200), --专业介绍 )
create table Student ( StuId varchar(20) primary key,--学号 StuName varchar(20) not null, --学生姓名 ProfessionalId int not null, --专业编号 )
insert into Professional(ProfessionalId,ProfessionalName,ProfessionalRemark) values('计算机','黄昏专业')
insert into Student(StuId,StuName,ProfessionalId) values('001','刘备',1,)

浙公网安备 33010602011771号