1、第一范式
1NF
数据表中的所有字段都是不可分割的原子值,如果字段值还可以拆分,就不满足第一范式。
create table student2(
id int primary key,
name varchar(20),
adress varchar(30)
);
insert into student2 values(1,'张三','中国江苏省无锡市滨湖区蠡湖大道1800号');
insert into student2 values(2,'李四','中国江苏省无锡市新吴区滨湖大道1700号');
insert into student2 values(3,'王五','中国江苏省无锡市滨湖区江南大道1600号');
这里地址可以细分
中国//江苏省//无锡市//滨湖区蠡湖大道1800号
按照这样划分可以再生成一个数据表
create table student3(
id int primary key,
name varchar(20),
country varchar(30),
privence varchar(30),
city varchar(30),
details varchar(30)
);
insert into student3 values(1,'张三','中国','江苏省','无锡市','滨湖区蠡湖大道1800号');
insert into student3 values(1,'李四','中国','江苏省','无锡市','新吴区滨湖大道1700号');
insert into student3 values(1,'王五','中国','江苏省','无锡市','滨湖区江南大道1600号');
严格说来上述的数据表也不算第一范式,因为滨湖区蠡湖大道1800号,还能再细分为滨湖区//蠡湖大道//1800号
范式,涉及的越详细,对于某些实际操作可能会更好(例如需要统计有多少无无锡市的人,这样便于筛选),但是不一定都是好处,要根据实际设计的需求。
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)
);
在上述数据表中,除主键外的其他列,只依赖于主键的部分字段。
product_name 只依赖于 product_id
customer_name 只依赖于 customer_id
如果想要其满足第二范式,则应该拆表
create table myorder(
order_id int primary key,
product_id int,
customer_id int
);
create table product(
id int primary key,
name varchar(20)
);
create table customer(
id int primary key,
name varchar(20)
);
3、第三范式
3NF
必须先满足第二范式,除开主键列的其他列之间不能有传递依赖。
create table myorder(
order_id int primary key,
product_id int,
customer_id int,
phone varchar(15)
);
在上述表中,phone依赖于customer_id,因此不满足第三范式。