复习一下以前存在电脑上的笔记
数据库三大设计范式
1、第一范式 1NF
数据表中的所有字段都是不可分割的原子值
create table student(
id int primary key,
name varchar(20),
address varchar(30)
);
insert into student values(1,'张三','中国四川省成都市武侯区武侯大道100号');
insert into student values(2,'李四','中国四川省成都市武侯区京城大道200号');
insert into student values(3,'王五','中国四川省成都市武侯区天府大道90号');
在student表中 address 字段实际储存的值还能继续拆分,不满足第一范式。
应改为:
create table student2(
id int primary key,
name varchar(20),
country varchar(30),
province varchar(30),
city varchar(30),
details varchar(30)
);
范式设计的越详细,对于某些实际操作可能更好,但是不一定都是好处。
最终与实际开发的需求来设计。
2、第二范式 2NF
在满足第一范式前提下,第二范式要求,除主键外的每一列都必须完全依赖与主键。
如果要出现不完全依赖,只可能发生在联合主键的情况
订单表:
create table myorder(
product_id int,
customer_id int,
product_name varchar(20),
customer_name varchar(20),
primary key(product_id,customer_id)
);
问题:
除主键以外的其他列,只依赖与主键的部分字段
解决:
拆表
create table myorder(
order_id int primary key,
product_id int,
cusomer_id int
);
create table product(
id int primary key,
name varchar(20)
);
create table customer(
id int primary key,
name varchar(20)
);
分成3个表后满足了第二范式的设计
3、第三范式 3NF
必须先满足第二范式,除开主键列的其他列之间不能有传递依赖关系
create table myorder(
order_id int primary key,
product_id int,
cusomer_id int,
customer_phone varchar(15)
);
在上述表中customer_phone虽然和order_id主键有关系,但是customer_phone还依赖于主键以外的cusomer_id,产生冗余,应该设计为
create table myorder(
order_id int primary key,
product_id int,
cusomer_id int,
);
create table customer(
id int primary key,
name varchar(20),
phone varchar(15)
);