table 的归一化
normalization of a table
我有这个 table,我必须标准化到 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
table已经满足 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 的定义:如果 table 在 1NF 中并且 没有非素数属性依赖于任何候选的任何适当子集,则它在 2NF 中table 的键。您的大多数 tables 只有 2 列,因此他们对此感到满意。对于Customer(CustId,CustomerName,CustomerAddress)
,候选键是CustId
,其他2列完全依赖于整个候选键,那就OK了。
对于 3NF,Wiki 说:table 中的所有属性仅由 table 的候选键决定,而不是由任何非主要属性。如您所见,您的 table 都很满意。
不过,正如你所说:
An Order belongs to one and only one customer
所以,我认为您不需要 Customer_Orders
号码。您应该删除它,并将 CustId
放在 Orders
table 中。因此,您的 Orders
table 将如下所示:Orders(OrderNum, OrderDate, CustId)
我有这个 table,我必须标准化到 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
table已经满足 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 的定义:如果 table 在 1NF 中并且 没有非素数属性依赖于任何候选的任何适当子集,则它在 2NF 中table 的键。您的大多数 tables 只有 2 列,因此他们对此感到满意。对于Customer(CustId,CustomerName,CustomerAddress)
,候选键是CustId
,其他2列完全依赖于整个候选键,那就OK了。
对于 3NF,Wiki 说:table 中的所有属性仅由 table 的候选键决定,而不是由任何非主要属性。如您所见,您的 table 都很满意。
不过,正如你所说:
An Order belongs to one and only one customer
所以,我认为您不需要 Customer_Orders
号码。您应该删除它,并将 CustId
放在 Orders
table 中。因此,您的 Orders
table 将如下所示:Orders(OrderNum, OrderDate, CustId)