SQL 服务器从另一个外键或唯一键中选择外键
SQL Server choosing foreign key from another foreign key or unique key
在我的场景中,我有一个 table tblCity
,它有两列作为外键 CompanyRef
和 BranchRef
,它们一起也是唯一的。
然后我会添加一个唯一键用作主键 [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
在我的场景中,我有一个 table tblCity
,它有两列作为外键 CompanyRef
和 BranchRef
,它们一起也是唯一的。
然后我会添加一个唯一键用作主键 [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