数据库设计:好吗?不使用外键?

时间:2011-10-08 16:21:01

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

如果我不使用外键可以,当我可以使用它时,我只是不使用它?

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

COUNTRY
-Id (PK)
-Code
-Name

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

4 个答案:

答案 0 :(得分:4)

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

因此,如果您想将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);

答案 1 :(得分:2)

不行,您违反了Referencial Integrity属性

答案 2 :(得分:0)

没有任何东西可以保证国家代码是唯一的,因此您在那里引入了可能的一对多关系。这意味着一个国家可能有一个以上的国家......这是不可取的。

答案 3 :(得分:0)

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