Home [SQL筆記] 3NF 第三正規化
Post
Cancel

[SQL筆記] 3NF 第三正規化

第一正規化 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,···),
······;
This post is licensed under CC BY 4.0 by the author.