Skip to main content

如何将数据库转换为第三范式(3NF)

62数据库设计规范 范式 3NF (可能 2024)

62数据库设计规范 范式 3NF (可能 2024)
Anonim

第三范式(3NF)是一种数据库原则,它通过建立第一范式(1NF)和第二范式(2NF)提供的数据库规范化原则来支持数据的完整性。

第三范式要求

数据库处于第三范式的基本要求有两个:

  • 数据库必须已满足1NF和2NF的要求。
  • 所有数据库列都必须依赖主键,这意味着任何列的值只能从主键派生。

关于主要关键依赖

让我们进一步探讨所有列必须依赖于主键的事实。

如果列的值可以从表中的主键和另一列派生,则它违反3NF。考虑具有以下列的Employees表:

  • 员工ID
  • 名字

LastName和FirstName都只依赖于EmployeeID的值吗?好吧,LastName可以依赖FirstName吗?不,因为LastName中没有任何内在的东西会暗示FirstName的值。 FirstName可以依赖LastName吗?再一次,因为同样如此:无论LastName是什么,它都无法提供关于FirstName值的提示。因此,此表符合3NF标准。

但请考虑此车辆表:

  • VehicleID
  • 生产厂家
  • 模型

制造商和模型可以从VehicleID派生 - 但模型也可以来自制造商,因为车辆模型仅由特定制造商制造。此表设计符合非3NF标准,因此可能导致数据异常。例如,您可以在不更新模型的情况下更新制造商,从而引入不准确之处。

为了使其符合要求,我们需要将附加的依赖列移动到另一个表并使用外键引用它。这将导致两个表:

车辆表

在下表中,ModelID是一个外键 楷模 表:

  • VehicleID
  • 生产厂家
  • ModelID

型号表

这个新表将模型映射到制造商。如果要更新特定于模型的任何车辆信息,您可以在此表中进行,而不是在车辆表中进行。

  • ModelID
  • 生产厂家
  • 模型

3NF模型中的派生字段

表可能包含派生字段 - 一个根据表中的其他列计算的字段。例如,请考虑此窗口小部件订单表:

  • 订单号
  • 顾客号码
  • 单价
  • 数量

总数违反3NF合规性,因为它可以通过将单位价格乘以数量得出,而不是完全依赖于主键。我们必须将其从表中删除以符合第三范式。

实际上,由于它是派生的,所以最好不要将它存储在数据库中。

我们可以在执行数据库查询时“动态”计算它。例如,我们之前可能使用此查询来检索订单号和总计:

SELECT OrderNumber,Total FROM WidgetOrders

我们现在可以使用以下查询:

SELECT OrderNumber,UnitPrice * Quantity AS Total FROM WidgetOrders

在不违反规范化规则的情况下实现相同的结果。