簡體   English   中英

SQL Server外鍵約束的好處

[英]SQL Server Foreign Key constraint benefits

我們正在設計一個數據庫,我需要考慮一些FK(外鍵)約束。 但它不僅限於正式的結構化和規范化。 我們只有在提供任何性能或可擴展性優勢時才會使用它。

我一直在通過一些有趣的文章和谷歌搜索實際的好處。 以下是一些鏈接:

http://www.mssqltips.com/tip.asp?tip=1296

我想更多地了解FK的好處(除了正式的結構和着名的級聯刪除\\更新)。

  • FK默認情況下沒有“索引”,因此在索引FK時需要考慮哪些因素?

  • 如何處理映射為外鍵的可空字段 - 這是允許的嗎?

  • 除了索引之外,這是否有助於優化SQL-Server中的查詢執行計划?

我知道還有更多,但我更願意專家就此發表意見。 請指導我。

  • 外鍵不提供性能或可伸縮性優勢。
  • 外鍵強制引用完整性。 如果有人試圖從父表中刪除錯誤的行,則可以通過引發錯誤來提供實際的好處。
  • 默認情況下,外鍵未編入索引。 您應該索引外鍵列,因為這樣可以避免在刪除/更新父行時對子表進行表掃描。
  • 您可以使外鍵列可為空並插入null。

主要的好處是,如果您的錯誤客戶端代碼試圖做錯了,您的數據庫將不會最終不一致。 外鍵是一種“約束”,所以你應該如何使用它們。

他們沒有任何“功能”好處,他們不會優化任何東西。 您仍然必須自己創建索引等。是的,您可以在作為外鍵的列中具有NULL值。

FK約束使您的數據保持一致。 而已。 這是主要的好處。 FK約束不會為您提供任何性能提升。

但是,除非你有目的的db結構非規范化,否則我建議你使用FK約束。 主要原因 - 一致性。

我已經在net上讀過至少一個示例,其中顯示外鍵確實提高了性能,因為優化器不必對表進行額外的檢查,因為它知道數據已經因FK而滿足某些條件。 對不起,我沒有鏈接,但博客提供了詳細的查詢計划輸出來證明它。

如上所述,它們用於數據完整性。 任何性能“損失”都會被修復損壞數據所需的時間徹底消除。

但是,可能存在間接的性能優勢。

至少對於SQL Server,FK中的列必須在每一側具有相同的數據類型。 如果沒有FK,您可以擁有nvarchar父級和varchar子級。 當您加入2個表時,您將獲得可以扼殺性能的數據類型轉換。

示例:導致問題的不同varchar長度

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM