0

我看到此評論:當使用自然鍵(而不是代理鍵)設計關係數據庫時,數據問題有哪些類型?

[應用]與數據最相關的問題是使用自然鍵的。

來源:Surrogate vs. natural/business keys

我想這更多的支持證據,作爲註釋留下太多的想象空間。

它表明使用自然鍵的練習會產生與數據相關的問題,但不會指定出錯的地方......數據是否被損壞?不同步?變得錯誤,丟失,損壞?很難查詢?

當使用自然鍵設計數據庫與使用代理鍵相反時,會發生什麼樣的數據問題?使用代理鍵時如何防止這些類型的問題?

回答

1

自然鍵的主要問題是它如何影響相關表。如果您更改了該鍵的值,則必須更正每個表中引用原始值的每一行。

例如,假設您有郵政編碼或郵政編碼表。通常,這些都是郵政編碼也是自然鑰匙的地方。現在假設郵局改變一個特定的郵政編碼(92680變爲92780)。當您更改郵政編碼表中的密鑰時,您必須轉到每個引用該郵政編碼的表格,並在那裏更新它。因此,郵政編碼中有92680的客戶地址,供應商地址等中的每一行都必須更改爲92780.

很明顯,如果相關表格未修復,您可能會遇到大問題。假設您根據郵政編碼收取保險費。想象一下,如果這些問題未在優質表格中解決,那麼您可能會遇到的問題。

使用代理鍵完全消除了這個問題。您只需更改郵政編碼表中的郵政編碼。代理鍵沒有改變。由於相關表存儲代理鍵,所以您不必更改其他任何內容。

+0

如果您的DBMS支持級聯更新,那麼外鍵引用將自動更新。如果你的自然鍵沒有被引用,那麼就不需要更新。代理鍵也一樣。 – sqlvogel

+0

您提出了一個很好的觀點。需要指出的是,僅僅因爲您的DBMS支持級聯更新,並不意味着所有內容都會自動處理。我在SQL Server中做了很多工作,它支持級聯更新。我不記得上次我看到級聯更新設置了所有其他參照完整性,以便事物變成「自動」。 但是,是的,如果您正確設置了一切,系統應該能夠處理您的更新。如果你使用自然鍵,這是首選的方法。 –