我有这张桌子,我必须归一化到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/

    10-11 08:32