数据库规范化 (3NF) - 外键



在尝试理解3NF之后,我遇到了一个小问题,我不确定我是否正确理解。

结构组件中出现此问题,如下所示:

s = {
Product(ProductID, ProductName, ProductDescription, SupplierName, SupplierAddress, SupplierID)
}
F = {
ProductID -> ProductName, ProductDescription
SupplierID -> SupplierName, SupplierAddress
}

当然,默认情况下,我会将供应商名称和供应商地址移动到不同的实体/表。该问题以供应商 ID 的形式出现。我不知道是否可以将供应商 ID 保留在产品表/实体中。

问题是,SupplierID不依赖于ProductID(因为它写在F中(。我相信把它放在第三个表中(如下(会很好。

S = {
  Products(ProductID, ProductName, ProductDescription),
  Suppliers(SupplierID, SupplierName, SupplierAddress),
  PS(ProductID, SupplierID)
}

但是,如果我将供应商 ID 放在产品表中(根本没有"PS"表(,3NF 是否仍然可以。

三个关系的分解在 3NF 中是正确的,而如果你将 SupplierID 放在产品表中,你会得到一个甚至在 2NF 中都没有的关系。

事实上,在一种关系中:

R1(ProductDescription, ProductID, ProductName, SupplierID) 

由于以下两个依赖项成立:

 ProductID → ProductName
 ProductID → ProductDescription

关系的(唯一(候选键是(产品 ID、供应商 ID(。这意味着前面的两个依赖项违反了 3NF,因为左侧不是超级键,右侧是非素属性。

最新更新