我无法理解规范化,有人可以解释这种关系模型的正常形式以及为什么?
客户(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))
答案 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,其示例与您的架构非常相似。