數據庫三大範式

作者:軟件民工
鏈接:https://www.zhihu.com/question/24696366/answer/133284744
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

如果換個方式來理解,這個問題就簡單了,表是對象的集合。

1NF, 字段不可再分。這個關係數據庫強制了,想建立複合的字段也建立不起來。關係數據庫出現之前纔有這個問題。
2NF,主鍵依賴,就是一張表裏面的字段,必須是跟主鍵相關的,不能把無關的數據放進來。主鍵依賴,實質就是,這個信息如果是對象的屬性,就放進來,否則就不放。
3NF,就是不能重複存儲相同的信息。這個情況,其實是在一個對象裏引用了另外一個對象,這個時候,存一個引用就夠了,而不是重複的存儲這個對象的多個副本。
2NF和3NF的本質是,對象的屬性依賴對象。

數據庫的主鍵,作用是什麼?它用來唯一的標識這個對象,同時,用來給其他對象引用 引用 引用(重要的事情說三次)
所以,實戰中,所有數據庫都是用int類型做主鍵(int,或者bigint),而且,主鍵一律是自增,這是不成文的規則,凡是不遵守這個規則的,都是錯的(雖然理論上可以)
這樣,數據庫寫數據的時候,幾乎是永遠不寫入同一個對象的重複信息的,需要重複的時候,只寫這個對象的ID


比如,前面答案的這個圖,應該是這樣建表的(sql server 語法)

USE master
GO
if exists (select * from sysdatabases where name='mydb')
drop database mydb
go

create database mydb
go

use "mydb"
go
create table Courses(
CourseID int identity primary key,
CourseName nvarchar(50) not null
);
create table Departments(
DepartmentID int identity primary key,
DepartmentName nvarchar(50) not null,
HeadName nvarchar(50) not null
);
create table Students(
StudentID int identity primary key,
Name nvarchar(50),
DepartmentID int not null
Constraint FkStudentDepartment foreign key (DepartmentID) references Departments(DepartmentID)
);
create table Results(
ResultID int identity primary key,
StudentID int not null,
CourseID int not null,
Result int not null,
Constraint FkResultStudent foreign key (StudentID) references Students(StudentID)
);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章