这种模式的正常形式是什么?为什么?

时间:2016-08-30 00:50:34

标签: sql database relational-database normalization database-normalization

我无法理解规范化,有人可以解释这种关系模型的正常形式以及为什么?

客户(customerID(PK),firstName,lastName,streetNo,street,suburb,postCode,state,phoneNumber,emailAddress,orderID(FK))

订单(orderID(PK),orderDateTime,paymentStatus,productQuantity,productID(FK))

产品(productID(PK),productName,productDescription,currentUnitPrice,inStock,status,categoryID,categoryName)

SalesPerson (salesPersonID(PK),firstName,lastName,email,phoneNumber,supervisorID(FK),orderID(FK))

OrderContents (orderContentsID(PK),日期,折扣,streetNo,街道,郊区,邮政编码,州,paymentStatus)

合作伙伴(partnerID(PK),companyName,streetNo,street,suburb,postcode,state,lastName,firstName,phoneNumber,email,orderContentsID(FK),salesPersonID(FK))

1 个答案:

答案 0 :(得分:0)

我认为你的架构不是2NF,因此是1NF。为了使表为2NF,列上的主键不得有任何部分依赖关系。考虑一下您的Customers表。您已将customerID标记为主键,但实际上这不起作用,因为给定的客户可能有多个订单。实际上,主键是组合(customerID, orderID)。但是这会产生客户地址列的问题,例如postCode依赖于复合主键。具体而言,可能会有多条记录显示相同的客户地址信息,这是多余的。

要使您的架构2NF(至少是其中的一部分),您可以创建一个新表CustomerOrders,它只存储客户及其订单之间的关系,而不是其他内容:

CustomersOrders(customerID, orderID) (PK)

然后,通过删除订单ID重构您的Customers表:

Customers (customerID (PK), firstName, lastName, streetNo, street, suburb, postCode,
           state, phoneNumber,emailAddress)

所以,我相信你现在的架构是1NF,但是你可以通过一些工作将它带到2NF。

以下是2NF上的reference,其示例与您的架构非常相似。