第一范式
数据表中的所有字段都是不可分割的原子值
是指,比如建立一个人的地址信息,不可建立字段为“中国湖南省长沙市天心区”如此,而要分别建立country,province,city,detail等多个分别的不可再分割的字段
第二范式
必须是满足第一范式的前提下,针对联合主键,第二范式要求,除主键外的每一列都必须完全依赖联合主键的而不能部分依赖,如果出现部分依赖联合主键的某一项,则需要拆分表
例:设计一个订单表
create table myoder(
product_id int,
custom_id int;
product_name varchar(20),
custom_name varchar(20),
primary key(product_id,custom_id)
);
product_name只依赖于product_id,custom_name只依赖于custom_id,即主键外的其他列只依赖于部分的主键,此时需要拆分表
create table myoder(
order_id int primary key,
product_id int,
custom_id int;
);
create table product(
id int primary key,
name varchar(20),
);
create table custom(
id int primary key,
name varchar(20),
);
第三范式
满足第二范式的情况下,除开主键列的其他列之间不能有传递关系依赖,确保数据表中的每一列数据都和主键直接相关,而不能间接相关
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。