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

时间:2018-01-18 20:06:50

标签: database database-normalization

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

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

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

F = {
ProductID -> ProductName, ProductDescription
SupplierID -> SupplierName, SupplierAddress
}

当然,默认情况下,我会将SupplierName和SupplierAddress都移动到不同的实体/表。问题以SupplierID的形式出现。我不知道将ProductID保留在Product表/实体中是否可以。

问题是,SupplierID不依赖于ProductID(因为它是在F中写的)。我相信将它放入第3个表(如下)会没问题。

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

但是,如果我将SupplierID放在Products表中(根本没有“PS”表),3NF是否仍然可以。

1 个答案:

答案 0 :(得分:0)

三个关系中的分解在3NF中是正确的,而如果您将SupplierID放在Product表中,则您获得的关系甚至不是2NF。

事实上,在关系中:

R1(ProductDescription, ProductID, ProductName, SupplierID) 

因为以下两个依赖项存在:

 ProductID → ProductName
 ProductID → ProductDescription

关系的(唯一)候选键是(ProductID,SupplierID)。这意味着前两个依赖项违反了3NF,因为左侧不是超级键,右侧是非主要属性。