2.3.1关于规范化

本文深入讲解数据库设计中的规范化过程,从第一范式到第三范式,避免数据冗余及异常,确保数据一致性。通过销售订单实例,阐述了如何将相关但独立的信息拆分到不同表中,以达到数据结构的优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

规范化是一个数据设计过程,其高级目标是将每个事实保持在一个位置,以避免数据冗余以及插入,更新和删除异常。有多个级别的规范化,本节将介绍前三个级别。考虑到第三范式(3NF)项是多么基本,只看到如何达到3NF才有意义。

考虑一种跟踪销售情况的情况。您跟踪的核心实体是销售订单,其中每个销售订单包含有关所购买的每个项目的详细信息(称为行项目):其名称,价格,数量等。该订单还包含客户的名称和地址等。有些订单有很多不同的订单项,有些订单只有一个。

在第一范式(1NF)中,没有重复的数据组,也没有重复的行。行和列(字段)的每个交集都只包含一个值,并且没有包含相同事实的列组。为避免重复行,有一个主键。对于销售订单,在第一范式中,不显示表格的单个字段中的每个销售订单的多个行项目。此外,不会有多个列显示订单项。

然后是第二范式(2NF),其中设计是第一范式,每个非键列依赖于完整的主键。因此,订单项会分为销售订单行项目表,其中每行代表一个订单的一个订单项。您可以查看订单项表,并查看所售商品的名称不依赖于订单项表的主键:销售商品是其自己的实体。因此,您将销售项目移动到其自己的表格,显示项目名称。每件商品的价格可能因订单而异(例如,由于折扣),因此这些价格保留在订单项表中。对于销售订单,客户的名称和地址不依赖于销售订单的主键:客户是其自己的实体。从而,

接下来是第三范式,其目标是确保不依赖于非关键属性。因此,目标是获取与行的主题(主键)不直接相关的列,并将它们放在自己的表中。因此,有关客户的详细信息(例如客户名称或客户城市)应放在单独的表中,然后将客户外键添加到订单表中。

2NF表与3NF表的不同之处的另一个例子是网球锦标赛的获胜者表,其中包含锦标赛,年份,获胜者和获胜者出生日期的列。在这种情况下,获胜者的出生日期很容易出现不一致,因为同一个人可能会在不同的记录中显示出生日期。避免这个潜在问题的方法是将桌子分成一个用于比赛获胜者,另一个用于球员出生日期

转载于:https://blog.51cto.com/9100067/2341431

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值