第一正規化 1NF
錯誤的1NF
下述設計不滿足第一正規化,因為聯繫方式還可以再拆分最小單位。
第一正規化1NF,是必須符合所有欄位值都是不可分解的原子值。
1
2
3
4
5
6
7
8
9
create table Student
(
StuId varchar(20) primary key, --學號
StuName varchar(20) not null, --學生姓名
StuContact varchar(50) not null, --聯繫方式
)
insert into Student(StuId,StuName,StuContact)
values('001','張三','QQ:11223344;Tel:99887766')
select * from Student
聯繫方式還可以再拆分為:電話、QQ。
第一正規化 1NF
第一正規化1NF:是對屬性的原子性,要求屬性具有原子性,不可再分解。 必須符合所有欄位值都是不可分解的原子值。
承上範例,可以對聯繫方式進行修改:如下:
1
2
3
4
5
6
7
create table Student
(
StuId varchar(20) primary key, --學號
StuName varchar(20) not null, --學生姓名
Tel varchar(20) not null, --電話
QQ varchar(20) not null --QQ
)
第二正規化 2NF
錯誤的2NF
下述設計中有兩個事物:1.學生信息、2.課程信息,很顯然這兩個事物都沒有保証實體的唯一性,這裡的姓名依賴學號,選項名稱依賴課程編號,所以不符合第二正規化2NF。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--選課成續表
create table StudentCourse
(
StuId varchar(20) not null, --學號
StuName varchar(20) not null, --姓名
CourseId varchar(20) not null, --課程編號
CourseName varchar(20) not null, --選課課程名稱
CourseScore int not null --考試成續
)
insert into StudentCourse(StuId,StuName,CourseId,CourseName,CourseScore) values
('001','張三','國文',80),
('001','張三','英文',90),
('002','李四','數學',80),
('003','王五','國文',70)
一張表兩個資訊,也造成數據的冗餘。
第二正規化 2NF
第二正規化2NF:是對記錄的唯一性,要求記錄有唯一標識,就實體的唯一性,即不存在部分依賴。
承上進行修改
課程表
1
2
3
4
5
6
7
8
9
create table Course
(
CourseId int primary key identity(1,1), --課程編號
CourseName varchar(30) not null, --課程名稱
CourseScore nvarchar(max) --課程介紹
)
insert into (StuId,StuName,CourseId,CourseName,CourseScore) values
('HTMT','靜態網頁的製作'),
('C#','快快樂樂學C#'),
學生表
1
2
3
4
5
6
7
8
9
create table Student
(
StuId int primary key identity(1,1), --學生編號
StuName varchar(50) not null, --學生姓名
StuSex char(2) not null --性別
)
insert into (StuId,StuName,StuSex) values
('張三','男'),
('李四','男')
考試信息表
1
2
3
4
5
6
7
8
9
10
11
create table Exam
(
ExamId int primary key identity(1,1), --選課成續編號
StuId int not null, --學生編號
CourseId int not null, --課程編號
Score int not null --考試成續
)
insert into (StuId,CourseId,Score) values
(1,1,90),
(1,2,96),
(2,2,80)
第三正規化 3NF
錯誤的3NF
下述可以再拆分為兩張表
1
2
3
4
5
6
7
8
create table Student
(
StuId varchar(20) primary key, --學號
StuName varchar(50) not null, --學生姓名
ProfessionalId int not null, --專業編號
ProfessionalName varchar(50), --專業名稱
ProfessionalRemark varchar(200) --專業介紹
)
第三正規化 3NF
第三正規化3NF:要求任何欄位不能由其他欄位派生出來,它要求欄位沒有冗餘,即不存在傳遞依賴:
專業表
1
2
3
4
5
6
create table Professional
(
ProfessionalId int not null, --專業編號
ProfessionalName varchar(50), --專業名稱
ProfessionalRemark varchar(200) --專業介紹
)
學生表
1
2
3
4
5
6
create table Student
(
StuId varchar(20) primary key, --學號
StuName varchar(50) not null, --學生姓名
ProfessionalId int not null, --專業編號
)
一次新增多筆資料 Insert Into 表 values(),(),()
一次新增多筆資料 (INSERT INTO SELECT)
語法:
1
2
3
4
5
INSERT INTO table_name
VALUES (value1_1, value2_2, value3_3,···),
(value2_1, value2_2, value2_3,···),
(value3_1, value3_2, value3_3,···),
······;