SQL 服务器从另一个外键或唯一键中选择外键

SQL Server choosing foreign key from another foreign key or unique key

在我的场景中,我有一个 table tblCity,它有两列作为外键 CompanyRefBranchRef,它们一起也是唯一的。

然后我会添加一个唯一键用作主键 [ID]

而在另一个名为 tblCustomer 的 table 中,我需要使用 tblCity 作为外键。

我的问题是我真的需要那个 ID 列还是我应该使用两个外键作为主键?在第二种情况下,我必须在 tblCustomer 中使用三列作为外键 (CompanyRef, BranchRef, CityRef) 或者什么?

这些方法中哪一种适合我的问题?

你需要建立关系

您需要使用哪种类型的关系的基础

主键和外键=一到钱

主键和主键=一对一

外键和外键=多对多

所以,为了让你的问题更清楚一点(我希望我做对了):

tblCity

CityId INT                           -- is part of the separate PK option
CompanyRef INT, FK -> tblCompany
BranchRef INT, FK -> tblBranch

tblCustomer

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:

城市听起来像是一个很笼统的概念。将来可能需要它,因此将两列相互拖动 table 引用它,意味着每个 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

tblCustomer

CustomerId INT                      
CityRef INT FK -> tblCity  

旁注: 如今匈牙利符号似乎很不受欢迎 - 请参阅 this 非常受欢迎的问题及其答案。

此外,我建议为同一事物保留相同的列名。例如

CompanyRef -> CompanyId (or whatever the PK is named)
BranchRef -> BranchId