我有这张桌子,我必须规范化到3nf
假设如下:
订单可以包含多个产品
每次客户下订单时,他们都会获得一个新的订单号
订单属于唯一一个客户
订单(OrderNum,OrderDate,(ProductId,ProductDesc),CustId,CustomerName,CustomerAddress)
到目前为止,我已经完成了这个
1FN
Orders (OrderNum, OrderDate, (ProductId,ProductDesc),(CustId,CustomerName,CustomerAddress, OrderNum))
2FN
Orders(OrderNum, OrderDate)
Orders_Product(OrderNum, ProductId)
Product(ProductId, ProductDesc)
Customer_Orders(OrderNum, CustId)
Customer(CustId,CustomerName,CustomerAddress)
3 NF
表已经满足3NF
Orders(OrderNum, OrderDate)
Orders_Product(OrderNum, ProductId)
Product(ProductId, ProductDesc)
Customer_Orders(OrderNum, CustId)
Customer(CustId,CustomerName,CustomerAddress)
依赖
OrderNum OrderDate,ProductId,ProductDesc,CustId, CustomerName, CustomerAddress
ProductId ProductDesc
CustId CustomerName, CustomerAddress
是我的2NF和3Nf正确吗?
答案 0 :(得分:3)
基于Wiki的定义:如果表格在1NF中,则表格在2NF中,而没有非素数属性取决于表格中任何候选键的任何正确子集 。您的大多数表只有2列,所以他们满意。对于Customer(CustId,CustomerName,CustomerAddress)
,候选键为CustId
,其他2列完全取决于整个候选键,然后就可以了。
对于3NF,Wiki表示:表中的所有属性仅由该表的候选键确定,而不是由任何非素数属性确定。如您所见,您的表格都很满意。
然而,正如你所说:
订单属于一个且只有一个客户
所以,我认为你不需要Customer_Orders
号码。您应该删除它,并将CustId
放在Orders
表中。因此,您的Orders
表格如下所示:Orders(OrderNum, OrderDate, CustId)