SQL Server从另一个外键或唯一键中选择外键

时间:2016-04-24 20:00:41

标签: sql-server database database-design database-relations

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

我会添加一个唯一的密钥用作主键[ID]

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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问题),但从开发人员的角度来看,我建议为城市提供单列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

tblCustomer

CustomerId INT                      
CityRef INT FK -> tblCity  

旁注:匈牙利语符号现在似乎非常沮丧 - 请参阅this非常受欢迎的问题及其答案。

另外,我建议保留相同的列名称。 E.g。

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

答案 1 :(得分:0)

你需要创造关系

您需要使用什么类型的关系的基础

主键和外键=一对钱

主键和主键=一对一

外键和外键=多对多