2011-10-08 32 views
1

可以,如果我不使用外鍵,當我可以使用它,我只是不使用它?數據庫設計:好嗎?不要使用外鍵?

例如,我的COUNTRY_STATE表應該將Country.Id作爲外鍵,但我沒有這樣做,而是使用CountryCode。我通過CountryCode得到每個國家的州。

COUNTRY 
-Id (PK) 
-Code 
-Name 

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

回答

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); 
+0

您也可以從國家/地區表中刪除代理主鍵,並將代碼作爲主鍵。使用這兩種方法中的任何一種,您都認爲代碼很少會改變...... –

0

沒有什麼,保證了國家代碼將是獨一無二的,所以你介紹了一個可能的一個一對多的關係存在。這意味着一個國家可能有不止一個國家​​......這是不可取的。

+0

我在CountryCode上有一個唯一的索引,所以它將始終是唯一的。它實際上可以成爲主要關鍵。 – 001

+0

那麼你應該沒問題......沒有規則說它必須是主鍵。 –

0

外鍵使用nocheck將允許查詢優化器簡化計劃。這將允許更少的讀取操作,從而提高查詢性能。當行數變高時,這將對性能產生巨大影響。