数据库的第一范式
字段值还能继续拆分的,就不是第一范式
例如某字段为“地址”,值为“某省某市某区某街道xx号”,那么这个字段就不是第一范式
。可以拆分为多个字段,比如“省份”,“城市”,“区”,“详细地址”等。
一般来说,范式设计的越详细对于某些操作比较方便,但不一定都是好的,对于某些操作可能合并起来更好。
第二范式
要求:
1、第二范式必须满足第一范式
2、除主键外其它列必须完全依赖主键
3、如果不完全依赖,必须是联合主键
实例:
创建一个订单表,包含产品id,顾客id,产品名称,顾客名称,顾客id和产品id为主键。
create table myorder(product_id int,customer_id int,product_name varchar(20),customer_name varchar(20),primary key(product_id,customer_id));
问题:
这张表看似没有问题,但仔细观察可以看出,实际上customer_name只依赖于customer_id,product_name只依赖于product_id,也就是除主键外的其它列只依赖于主键的部分。
解决:
可以把这一个表拆分成多个表。
create table my_order(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));
拆成三个表之后就实现了第三范式!
第三范式
要求:
1、必须满足第二范式
2、除开主键列的其它列之间不能有传递依赖
如果要在上面的信息中增加一列phone
如果在my_order表中添加
create table my_order(order_id int primary key,
product_id int,
customer_id int,
customer_phone varchar(15));
明显可以看出customer_phone 虽然和order_id有依赖关系,与 customer_id 也有依赖关系,因此可以直接把它放在customer表中。
create table customer(id int primary key,
name varchar(20),
customer_phone varchar(15));