【问题标题】:Database Design: OK? not to use foreign key?数据库设计:好吗?不使用外键?
【发布时间】:2011-10-08 16:21:00
【问题描述】:

如果我不使用外键可以吗,我什么时候可以使用它,我只是不使用它?

例如,我的 COUNTRY_STATE 表应该有 Country.Id 作为外键,但我没有这样做,而是有 CountryCode。我通过 CountryCode 获得每个国家/地区的州。

COUNTRY
-Id (PK)
-Code
-Name

COUNTRY_STATE
-Id (PK)
-Code
-Name
-CountryCode 

【问题讨论】:

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


    【解决方案1】:

    外键不一定需要引用主键。它还可以引用唯一约束。

    因此,如果您想将 country_code 保留在 country_state 表中,您可以这样做并且仍然有一个外键来确保仅使用有效的国家/地区代码:

    ALTER TABLE country 
      ADD CONSTRAINT uq_code UNIQUE (code);
    
    ALTER TABLE country_state 
        ADD CONSTRAINT fk_state_country 
        FOREIGN KEY (country_code) REFERENCES country (code);
    

    【讨论】:

    • 您也可以从 Country 表中删除代理主键,并将代码作为主键。使用这两种方法中的任何一种,您都假设代码很少会改变......
    【解决方案2】:

    不行,你违反了Referencial Integrity属性

    【讨论】:

      【解决方案3】:

      没有什么可以保证国家代码是唯一的,因此您在此处引入了可能的一对多关系。这意味着一个国家可能拥有多个国家……这是不可取的。

      【讨论】:

      • 我在 CountryCode 上有一个唯一索引,所以它总是唯一的。它实际上可以成为主键。
      • 那你应该没问题...没有规则说它必须是主键。
      【解决方案4】:

      不使用 nocheck 的外键将允许查询优化器简化计划。这将允许更少的读取,从而提高查询性能。当您的行数变高时,这将对性能产生巨大影响。

      【讨论】: