第三范式(3 nf)是一个数据库的原则,支持通过构建在数据的完整性数据库规范化原则所提供的第一个范式(1 nf)和第二范式(2 nf)。3 nf的目的是提高数据库处理,同时最小化存储成本。
第三范式的要求
有两个基本要求3 nf数据库:
- 数据库必须符合1 nf和2 nf的要求。
- 所有的数据库列必须依赖主键,这意味着任何列的值只能来源于主键。
主键的依赖
让我们进一步探索我们所说的事实,所有列都必须依赖于主键。如果一个列的值可以从主键和另一个表中的列,它违反了3 nf。考虑一个表与这些列的员工:
- EmployeeID
- FirstName
- 姓
做两名和姓的值只取决于EmployeeID吗?嗯,名取决于姓吗?不,因为没有固有的LastName建议FirstName的价值。
姓取决于名吗?没有再一次,因为也是如此:无论LastName可能,它不能提供一个提示,FirstName的价值。因此,这个表是3 nf兼容。
然后,考虑一下这个表的车辆:
- VehicleID
- 制造商
- 模型
制造商和模型可以来源于VehicleID,但模型也可能来自制造商,因为只有一个特定的制造商使车辆模型。这个表设计non-3NF兼容,并可能,因此,导致数据异常。例如,您可能更新制造商没有更新模型,引入错误。
将数据库放在第三范式(3 nf)
将额外的依赖列移动到另一个表,使用一个引用它外键将使其兼容。这将导致两个表,我们称之为“汽车”和“模型”。
在“工具”表,ModelID“模型”表的外键:
- VehicleID
- 制造商
- ModelID
新的“模型”表模型映射到制造商。如果你想更新任何车辆信息特定于一个模型,在这个表你会做它,而不是在“车辆”表中。
- ModelID
- 制造商
- 模型
派生的3 nf模型中的字段
表可能包含导出字段,这是一个计算基于其他表中的列。例如,考虑一下这个小部件订单表:
- 订单号
- 客户编号
- 单价
- 数量
- 总
总休息3 nf合规,因为它可以通过单价乘以数量,而不是完全依赖于主键。你必须从表中删除全部符合第三范式。
因为它是派生的,最好不要将其存储在数据库中,而是直接计算它在飞行中在执行数据库查询。例如,我们可能曾经使用这个查询来检索订单数量和总数:
OrderNumber选择,总
从WidgetOrders
现在使用以下查询来实现相同的结果在不违反规范化规则:
选择OrderNumber, UnitPrice *总数量
从WidgetOrders