数据库规范化组织成称为范式 (1NF 到 5NF) 的级别,每个级别处理特定的数据冗余和完整性问题。 前三个范式(1NF、2NF、3NF)是最广泛使用的,而博伊斯-科德范式(BCNF)、4NF 和 5NF 则处理更复杂的场景。 每个级别都建立在前一个级别的基础上,执行更严格的规则以消除异常并确保高效的数据组织。 对于大多数应用程序来说,达到 3NF 或 BCNF 就足够了,尽管更高形式的规范化在涉及多值或连接依赖项的特殊情况下很有用。
第一范式 (1NF) 要求表具有原子值(没有重复组或数组)和一个唯一的 主键。 例如,一个存储客户订单的表,其中包含一个像 Products
这样的列,该列包含逗号分隔的值(例如,“Book, Pen, Laptop”)违反了 1NF。 为了解决这个问题,将数据拆分为单独的行,每行列出每个订单中的一件产品。 第二范式 (2NF) 添加了非键属性必须依赖于整个主键,而不仅仅是其中的一部分。 考虑一个具有 OrderID
和 ProductID
组合键的 OrderDetails
表。 如果 ProductName
列仅依赖于 ProductID
(而不是完整键),则会产生冗余。 为了解决这个问题,将 ProductName
移动到由 ProductID
链接的单独 Products
表中。
第三范式 (3NF) 消除了传递依赖,即非键属性依赖于另一个非键属性。 例如,一个具有 CustomerID
、ZipCode
和 City
的 Customers
表,其中 City
可能由 ZipCode
决定(而不是直接由 CustomerID
决定)。 为了规范化,创建一个将 ZipCode
链接到 City
的 ZIPCodes
表。 BCNF 通过要求每个决定因素(影响其他属性的属性)都必须是候选键来加强 3NF。 例如,如果一个表跟踪 StudentID
、Course
和 Instructor
,并且 Instructor
决定 Course
,则 BCNF 强制拆分该表以避免依赖于非键属性。 更高级的形式,如 4NF 和 5NF 处理多值依赖(例如,拆分独立属性具有多个值的表)和复杂的连接场景,但这些在小众用例之外很少需要。