数据库sql的三大范式

数据库的第一范式

字段值还能继续拆分的,就不是第一范式
例如某字段为“地址”,值为“某省某市某区某街道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));
发布了16 篇原创文章 · 获赞 9 · 访问量 1041

猜你喜欢

转载自blog.csdn.net/qq_42871249/article/details/102880406