数据库三范式

数据库的**三范式(3NF,Third Normal Form)**是数据库设计中的一套规范,旨在减少数据冗余,提高数据一致性。以下是三范式的详细介绍:


第一范式(1NF,First Normal Form)

要求:

  1. 数据原子性(列不可再分):每一列的值必须是最小单位,不可再拆分。
  2. 同一列中的数据类型相同:例如,不能在 phone_number 列中同时存放电话号码和电子邮件地址。
  3. 表中必须有主键:每一行数据必须有一个唯一标识(主键)。

示例(不符合 1NF)

学号姓名电话号码
1001张三13812345678, 13998765432

问题:

  • 电话号码字段存储了多个电话号码,违反了原子性,应该拆分成单独的行或单独的表。

符合 1NF

学号姓名电话号码
1001张三13812345678
1001张三13998765432

第二范式(2NF,Second Normal Form)

要求:

  1. 符合第一范式(1NF)
  2. 消除部分依赖(消除非主键列主键的部分依赖):
    • 如果主键是复合主键(由多个字段组成),则非主键字段必须完全依赖于整个主键,而不能仅依赖其中的一部分。

示例(不符合 2NF)

订单号产品ID产品名称价格购买数量
001P001手机30002
001P002电脑50001

问题:

  • 订单号 + 产品ID 作为主键,但 产品名称价格 仅依赖于 产品ID,与 订单号 无关,造成部分依赖

符合 2NF
拆分成两张表:

  1. 订单详情表

    订单号产品ID购买数量
    001P0012
    001P0021
  2. 产品表

    产品ID产品名称价格
    P001手机3000
    P002电脑5000

第三范式(3NF,Third Normal Form)

要求:

  1. 符合第二范式(2NF)
  2. 消除传递依赖(非主键字段不能依赖于其他非主键字段):
    • 非主键字段必须直接依赖于主键,而不能通过其他非主键字段间接依赖。

示例(不符合 3NF)

员工ID姓名部门ID部门名称
1001张三D01市场部
1002李四D02技术部

问题:

  • 部门名称 依赖于 部门ID,而 部门ID 依赖于 员工ID,这属于传递依赖
  • 如果某个部门没有员工,则 部门名称 无法存储,会导致数据冗余和更新异常。

符合 3NF
拆分成两张表:

  1. 员工表

    员工ID姓名部门ID
    1001张三D01
    1002李四D02
  2. 部门表

    部门ID部门名称
    D01市场部
    D02技术部

总结

级别规范解决问题
1NF消除重复列,保证原子性防止一个字段存储多个值
2NF消除部分依赖确保所有非主键列完全依赖于整个主键
3NF消除传递依赖确保所有非主键列只直接依赖于主键

满足三范式后,数据库设计更加规范化,减少了数据冗余,提高了数据一致性,但可能会导致查询时需要多表关联,影响查询效率。因此,在实际应用中,需要在范式化(减少冗余)和反范式化(提高性能)之间做平衡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值