数据库三范式并示例演示

数据库三范式是设计关系型数据库的规范,确保数据不会出现冗余或不一致。三范式包括以下规则:

第一范式(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

这个新的设计符合第三范式,因为每个非主键列都直接依赖于主键。同时,我们也解决了第二范式中的问题,每个非主键列都完全依赖于主键。这种设计可以确保数据在插入、更新和删除时保持一致和准确。