表格

时间:2015-10-05 23:16:25

标签: sql normalization

我有这张桌子,我必须规范化到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正确吗?

1 个答案:

答案 0 :(得分:3)

基于Wiki的定义:如果表格在1NF中,则表格在2NF中,而没有非素数属性取决于表格中任何候选键的任何正确子集 。您的大多数表只有2列,所以他们满意。对于Customer(CustId,CustomerName,CustomerAddress),候选键为CustId,其他2列完全取决于整个候选键,然后就可以了。

对于3NF,Wiki表示:表中的所有属性仅由该表的候选键确定,而不是由任何非素数属性确定。如您所见,您的表格都很满意。

然而,正如你所说:

  

订单属于一个且只有一个客户

所以,我认为你不需要Customer_Orders号码。您应该删除它,并将CustId放在Orders表中。因此,您的Orders表格如下所示:Orders(OrderNum, OrderDate, CustId)