数据库三大范式

作者:软件民工
链接: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)
);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章