数据库三范式是设计关系型数据库的规范,确保数据不会出现冗余或不一致。三范式包括以下规则:
第一范式(1NF):每个列必须是原子的,不可再分。每一行必须具有唯一的标识符或主键,以便能够区分每个数据。
第二范式(2NF):每个非主键列必须完全依赖于主键。换句话说,如果一个表有一个复合主键,那么每个非主键列必须依赖于整个主键,而不是只依赖于主键的一部分。
第三范式(3NF):每个非主键列必须直接依赖于主键,而不是依赖于其他非主键列。
以下是一个示例演示三范式的设计原则:
假设我们有一个订单系统,其中有三个表:Customers(客户),Orders(订单)和OrderDetails(订单详情)。
下面是表结构:
Customers
CustomerID (PK)
CustomerName
CustomerAddress
Orders
OrderID (PK)
CustomerID (FK)
OrderDate
OrderDetails
OrderDetailID (PK)
OrderID (FK)
ProductID (FK)
Quantity
Price
我们可以看出这些表都符合第一范式,每个列都是原子的,没有重复的列。然而,我们需要确保这些表也符合第二范式和第三范式。
根据第二范式,每个非主键列必须完全依赖于主键。在Orders表中,OrderDate只依赖于OrderID,而不依赖于CustomerID。因此,我们需要将OrderDate移到OrderDetails表中,这样它就完全依赖于主键。
修改后的表结构如下:
Customers
CustomerID (PK)
CustomerName
CustomerAddress
Orders
OrderID (PK)
CustomerID (FK)
OrderDetails
OrderDetailID (PK)
OrderID (FK)
ProductID (FK)
Quantity
Price
OrderDate
现在,我们需要根据第三范式,确保每个非主键列都直接依赖于主键。在OrderDetails表中,Quantity和Price都直接依赖于OrderDetailID,而不是直接依赖于OrderID。因此,我们需要创建一个新的ProductOrders表,将OrderID、ProductID、Quantity、Price和OrderDate移动到该表中,并将OrderDetailID从OrderDetails表中删除。
修改后的表结构如下:
Customers
CustomerID (PK)
CustomerName
CustomerAddress
Orders
OrderID (PK)
CustomerID (FK)
ProductOrders
ProductOrderID (PK)
OrderID (FK)
ProductID (FK)
Quantity
Price
OrderDate
这个新的设计符合第三范式,因为每个非主键列都直接依赖于主键。同时,我们也解决了第二范式中的问题,每个非主键列都完全依赖于主键。这种设计可以确保数据在插入、更新和删除时保持一致和准确。