具有大表与小表的外键

时间:2016-10-19 09:23:40

标签: sql sql-server foreign-key-relationship

与较大表的外键关系是否会对性能产生影响?

CREATE TABLE CHARTOFACCOUNT --Contains all accounts
(
    AccountNo VARCHAR(23) PRIMARY KEY,
    --,
)

CREATE TABLE DEPOSITACCOUNT --Contains all deposit accounts(row less than CHARTOFACCOUNT)
(
    AccountNo VARCHAR(23) PRIMARY KEY,
    --,
)

CREATE TABLE DEPOSITACCOUNTSTATUS --Contains all Deposit account status 1 to 1 relation
(
    AccountNo VARCHAR(23) PRIMARY KEY,
    --,    
)

DEPOSITACCOUNTCHARTOFACCOUNT具有外键关系。现在来DEPOSITACCOUNTSTATUS时,我可以与DEPOSITACCOUNTCHARTOFACCOUNT建立外键关系,两者都有效。但由于CHARTOFACCOUNT包含的行数多于DEPOSITACCOUNT,因此存在任何性能问题?

2 个答案:

答案 0 :(得分:1)

这听起来像是过早优化的情况。

根据您尝试建模的系统选择外键,而不仅仅是因为您认为可能存在性能问题。

你说:

  

我可以与DEPOSITACCOUNT建立外键关系   CHARTOFACCOUNT和两者都有效

这让我觉得你的设计可能有问题。 CHARTOFACCOUNT表存储与DEPOSITACCOUNT表不同的是什么?

为什么存款帐户与其他帐户类型的处理方式不同?为什么不将它们存储在类型为属性的Account表中?

为什么存款帐户状态与帐户本身分开存储?如果表之间存在一对一的关系,您可以将该信息移到Account表中。

答案 1 :(得分:1)

基本上,您有三个具有相同主键的表。假设您在表上创建了这些聚簇索引,那么表之间的访问将非常快。

你应该建立你的关系,这样他们才有意义。从命名方案来看,我猜测DepositAccountStatusDepositAccount有关。因此,我会将外键关系放在该表中。

这不是性能问题。这只是简单地对数据建模。

另一个问题是为什么状态表与DepositAccount具有相同的主键。为什么不直接将状态放在该表中?