可以,如果我不使用外鍵,當我可以使用它,我只是不使用它?數據庫設計:好嗎?不要使用外鍵?
例如,我的COUNTRY_STATE表應該將Country.Id作爲外鍵,但我沒有這樣做,而是使用CountryCode。我通過CountryCode得到每個國家的州。
COUNTRY
-Id (PK)
-Code
-Name
COUNTRY_STATE
-Id (PK)
-Code
-Name
-CountryCode
可以,如果我不使用外鍵,當我可以使用它,我只是不使用它?數據庫設計:好嗎?不要使用外鍵?
例如,我的COUNTRY_STATE表應該將Country.Id作爲外鍵,但我沒有這樣做,而是使用CountryCode。我通過CountryCode得到每個國家的州。
COUNTRY
-Id (PK)
-Code
-Name
COUNTRY_STATE
-Id (PK)
-Code
-Name
-CountryCode
外鍵不一定需要引用一個主鍵。它也可以引用一個唯一的約束。
所以,如果你想保持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);
沒有什麼,保證了國家代碼將是獨一無二的,所以你介紹了一個可能的一個一對多的關係存在。這意味着一個國家可能有不止一個國家......這是不可取的。
我在CountryCode上有一個唯一的索引,所以它將始終是唯一的。它實際上可以成爲主要關鍵。 – 001
那麼你應該沒問題......沒有規則說它必須是主鍵。 –
這也不行,你違反了Referencial Integrity財產
外鍵使用nocheck將允許查詢優化器簡化計劃。這將允許更少的讀取操作,從而提高查詢性能。當行數變高時,這將對性能產生巨大影響。
您也可以從國家/地區表中刪除代理主鍵,並將代碼作爲主鍵。使用這兩種方法中的任何一種,您都認爲代碼很少會改變...... –