在我的场景中,我有一个表tblCity
,其中有两列作为外键CompanyRef
和BranchRef
,它们在一起也是唯一的。
我会添加一个唯一键用作主键 [ID]
在另一个名为tblCustomer
的表中,我需要使用 tblCity
作为外键。
我的问题是我真的需要该 ID 列还是应该使用两个外键作为主键?在第二种情况下,我必须在tblCustomer
中使用三列作为外键(CompanyRef, BranchRef, CityRef
)还是什么?
这些方法中哪一种适合我的问题?
所以,只是为了在你的问题中把事情说清楚一点(我希望我做对了):
tblCity
CityId INT -- is part of the separate PK option
CompanyRef INT, FK -> tblCompany
BranchRef INT, FK -> tblBranch
tbl客户
CustomerId INT -- not interesting here
CityRef INT FK -> tblCity -- is part of the separate PK option
CompanyRef INT -- part of the alternative
BranchRef INT -- part of the alternative
我无法判断哪一个在性能方面最好(这更像是一个 DBA 问题),但从开发人员的角度来看,我建议为 City 设置单列 PK:
城市听起来像是一个很通用的概念。将来可能需要它,因此在引用它的彼此表中拖动两列意味着每个 JOIN 都将位于这两列上。
最终的解决方案可能如下所示:
tblCity
CityId INT PRIMARY KEY IDENTITY(1, 1),
CompanyRef INT, FK -> tblCompany
BranchRef INT, FK -> tblBranch
UNIQUE (CompanyRef, BranchRef) -- acts as a constraint, but also an index
tbl客户
CustomerId INT
CityRef INT FK -> tblCity
旁注:如今,匈牙利语符号似乎很不鼓励 - 请参阅这个非常流行的问题及其答案。
另外,我建议为同一件事保留相同的列名。 例如
CompanyRef -> CompanyId (or whatever the PK is named)
BranchRef -> BranchId
你需要建立关系
您需要使用哪种类型的关系的基础
主键和外键 = 一到钱
主键和主键 = 一对一
外键和外键 = 多对多