十六、数据库设计之三范式

文章介绍了数据库设计中的三范式,包括1NF(第一范式)强调列的原子性,2NF(第二范式)要求非主键字段完全依赖主键,3NF(第三范式)禁止传递依赖。通过示例解释了如何判断表结构是否符合这些范式,并提供了不符合范式的表结构改造方法。
摘要由CSDN通过智能技术生成
学习目标
  • 能够判断一个表结构的设计是否符合三范式的要求

1、数据库设计之三范式的介绍

范式:对设计数据库提出的一些规范,目前有迹可循的共有8种范式,一般遵守三范式即可。

  • 第一范式(1NF):强调的是列的原子性,即,列不能再分成其他列。
  • 第二范式(2NF):满足1NF,另外包含两部分内容,一是表必须有一个主键:二是非主键字段必须完全依赖于主键,而不能只依赖主键的一部分
  • 第三范式(2NF):满足2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖,即不能存在:非主键列A依赖于非主键列B,非主键列B依赖于主键的情况

2、第一范式的介绍

如下所示的表结构:
contactnameTeladdress
张三、10086、河北张三10086河北
说明:
  • 这种表格设计就没有达到1NF,要符合1NF我们只需要把列拆分,即把contact字段拆分成name、Tel、address等字段

3、第二范式的介绍

如下所示的表结构:

OrderDetail表

OrderIDProductIDUnitPriceDiscountQuantityProductName
1001765418.82.24洗发水

拆分后的OrderDetail表

OrderIDProductIDDiscountQuantity
100176542.24

Product表

ProductIDUnitPriceProductName
765418.8洗发水
说明:
  • 这种表结构设计就没有达到2NF,因为Discount(折扣),Quantity(数量)完全依赖于主键(OrderID),而UnitPrice(单价),ProductName(产品名称)只依赖于ProductID,所以OrderDetail表不符合2NF。
  • 我们可以把OrderDetail表拆分为OrderDetail(OrderID、ProductID、Discount、Quantity)和Product(ProductID、UnitPrice 、ProductName),这样就符合第二范式了。

4、第三范式的介绍

如下所示的表结构:

Order表

OrderIDOrderDateCustomerIDCustomerNameCustomerAddressCustomerCity
10012023-02-03 00:00:00AM12345张三xx市xx县xx镇xx村河北

拆分后的Order表

OrderIDOrderDateCustomerID
10012023-02-03 00:00:00AM12345

Customer表

CustomerIDCustomerNameCustomerAddressCustomerCity
12345张三xx市xx县xx镇xx村河北
说明:
  • 这种表结构设计没有达到3NF,因为OrderDate、 CustomerID、 CustomerName、 CustomerAddress、 CustomerCity等非主键列都完全依赖于主键(OrderID),所以符合2NF。由于CustomerName、 CustomerAddress、 CustomerCity直接依赖的是CustomerID(非主键列),而不是直接依赖于主键,通过传递才依赖于主键,所以不符合3NF。
  • 我们可以把Order表拆分为Order(OrderID、 OrderDate、 CustomerID)和Customer(CustomerID、CustomerName、CustomerAddress、CustomerCity)从而达到3NF。

5、小结

  • 范式就是设计数据库的一些通用规范
    • 1NF强调字段是最小单元,不可再分
    • 2NF强调在1NF基础上必须要有主键,非主键字段必须完全依赖于主键,而不能只依赖主键的一部分
    • 3NF强调在2NF的基础上非主键字段必须直接依赖于主键,不能传递依赖(间接依赖)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值