mysql 学习记录 -3.数据库的三大设计范式

本文探讨了数据库设计中的第一范式(1NF)、第二范式(2NF)和第三范式(3NF),强调了遵循这些范式的重要性。通过实例说明了如何将不满足范式的表拆分成更符合规范的结构,以减少冗余和提高数据一致性。通过对订单表的重构,展示了如何达到2NF和3NF,以确保每个字段都直接依赖于主键,并消除传递依赖关系。
摘要由CSDN通过智能技术生成

1NF
只要字段值还可以继续拆分,就不满足第一范式。

范式设计得越详细,对某些实际操作可能会更好,但并非都有好处,
需要对项目的实际情况进行设定。

2NF
在满足第一范式的前提下,其他列都必须完全依赖于主键列。
如果出现不完全依赖,只可能发生在联合主键的情况下:

-- 订单表
create table myorder(
    product_id int,
    customer_id int,
    product_name varchar(20),
    customer_name varchar(20)
);

实际上,在这张订单表中,product_name 只依赖于 product_id ,customer_name 只依赖于 customer_id 。
也就是说,product_name 和 customer_id 是没用关系的,customer_name 和 product_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)
);

拆分之后,myorder 表中的 product_id 和 customer_id 完全依赖于 order_id 主键,
而 product 和 customer 表中的其他字段又完全依赖于主键。满足了第二范式的设计!

3NF
在满足第二范式的前提下,除了主键列之外,其他列之间不能有传递依赖关系。

create table myorder(
    order_id int primary key,
    product_id int,
    customer_id int,
    customer_phone varchar(20)
);

表中的 customer_phone 有可能依赖于 order_id 、 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),
    phone varchar(15)
);

修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,
满足了第三范式的设计!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值