数据库三大设计范式
第一范式,1NF:
- 数据表中所有字段都是不可分割的原子值
例如:
create table student(
id int primary key,
name varchar(20),
address varchar(40)
);
-- 这里"address"地址采用详细形式,例如“浙江省杭州市西湖区留和路100号”,对于地址来说还是可以拆分的。所以不满足第一范式
-- 如果将地址换成一个个最小单元,如
province varchar(20),
city varchar(20),
district varchar(20),
st varchar(20),
number int
-- 那么将满足第一范式。对于某些操作来说,范式,设计得越详细越好,但是不一定。
第二范式:
- 必须满足第一范式情况下,第二范式要求,除主键外的每一列都必须完全依赖于主键。如果出现不完全依赖,那么只可能发生在联合主键的情况下(主键有多个,主键之间没有相互依赖)。
create table myorder( -- 订单表例子
product_id int,
product_name varchar(40),
customer_id int,
customer_name varchar(20),
primary key(product_id,customer_id)
);
-- 在这个例子中,除主键(product_id,customer_id)之外的字段(两个name)只依赖于部分主键(各自name依赖于各自id),所以不满足第二范式。
-- 拆分修改
create table myorder(
order_id int primary key,
product_id int,
customer_id int
);
create table product(
id int primary key,
name varchar(40)
);
create table customer(
id int primary key,
name varchar(20)
);
第三范式:
-
必须先满足第二范式,除开主键列的其他列之间不能有传递依赖关系,例如
create table myorder( order_id int primary key, product_id int, customer_id int, customer_phone varchar(15) ); -- 这里虽然满足第二范式,其他字段都能通过主键找到,但是这里customer_phone和customer_id存在依赖,所以不满足第三范式。可以改成 create table myorder( order_id int primary key, product_id int, customer_id int ); create table customer( id int primary key, name varchar(20), customer_phone varchar(15) );