我有这张桌子,我必须归一化到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正确吗?
最佳答案
根据Wiki的定义:如果表位于1NF和中,则表位于2NF中,没有非素数属性不依赖于表的任何候选键的任何适当子集。您的大多数表只有2列,因此他们对此表示满意。对于Customer(CustId,CustomerName,CustomerAddress)
,候选键为CustId
,其他两列完全取决于整个候选键,然后就可以了。
对于3NF,Wiki表示:表中的所有属性仅由该表的候选键确定,而不由任何非素数属性确定。如您所见,您的表都令人满意。
但是,正如您所说:
订单属于一个且只有一个客户
因此,我认为您不需要Customer_Orders
号。您应将其删除,然后将CustId
放入Orders
表中。因此,您的Orders
表将如下所示:Orders(OrderNum, OrderDate, CustId)
关于sql - 表的规范化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32959351/