2012-07-02 41 views
3

我正在爲Timesheet應用程序設計一個Oracle數據庫。我想知道是否真的有必要對錶(主和子)有外鍵約束。爲什麼我應該創建外鍵約束?

正如我們所知道的那樣,從理論上講,在表格上有適當的參照完整性是很好的,但是我們真的需要它們嗎?

我聽說外鍵使得數據庫在每個DML操作上額外工作,因爲它必須檢查FK一致性。這可能會降低性能。但另一方面,在將子行插入子表之前,主鍵已被刪除的情況下可能會有所幫助。

性能是時間表應用程序中的一個主要問題,在本月底將有大約250人填充他們的時間表(可能在同一時間)。

如果我沒有在表上的外鍵約束,那麼我必須首先檢查它(在存儲過程中)如果每次在子表中插入一個新記錄之前主鍵存在主鍵?

加入:在過去,我曾與許多經驗的oracle數據庫開發人員合作,我們從未在表上使用外鍵約束。

+9

250的用戶還不是很多。特別是如果它每週只有一次 - 你不應該關心從foriegn關鍵約束檢查中感知到的性能。 – slugster

+1

http://stackoverflow.com/questions/2317391/is-there-a-severe-performance-hit-for-using-foreign-keys-in-sql-server – Habib

+3

一切,你不要在你的數據庫檢查會最終包含無效數據。所以除非你想在幾年內有大量的數據垃圾,否則實施你的限制。 – Rene

回答

14

我會說,在地方外鍵約束,然後措施的性能和開發應用如果性能是一個問題,措施與FK約束和無DB之間的差異,以及如果他們證明是一個性能問題,考慮消除它們。

您不太可能會發現它們是任何性能問題的來源,我不會推薦從一開始就完全忽略它們,以此推測它會帶來更好的性能。

你不需要他們,因爲你不需要驗證輸入,繫好安全帶以同樣的方式,等

+7

+1加上:只是因爲一點點的表現,我會**永遠不會**犧牲我的參考完整性 - **特別是**不在生產中! –

+0

如果我沒有上表的外鍵約束,則我一定要首先檢查它(在存儲過程中)如果主鍵在主表中存在每次在子表中插入新記錄之前?難道它不會減慢DML操作,因爲每當我插入一條新記錄時,我都會向高手(對於PK存在)查詢表? – user1263981

+0

通過運行您所說的查詢(每次插入或更新和刪除前),您正在對該密鑰字段進行某種形式的驗證,從而強制實現密鑰的參照完整性。至於表現,我認爲你最好的選擇是......進行測試,看看有什麼? :/ –

1

我2美分... 250人是什麼擔心。數據庫可以處理大量的數據和引用。這是他們的目的。在創建按鍵和結構時顯然會用到你的頭。但是,您將掌握準確的數據,而不是可能出現的噩夢來建立報告,甚至不可能......在一天結束時......這就是您描述的應用程序的一個重點,緩解和協助數據輸入並加強數據準確性。

4

具有參照完整性時,插入或更新關鍵列時會有輕微的性能下降。然而,這幾乎比總是更彌補了

1)可靠和一致的數據

2)Significantly improved query times

真的,不過,如果你不實施參照完整性,爲什麼地球上你會使用參考數據庫?

3

確保外鍵強制執行(例如,在SP或觸發)的任何方法,將至少爲引用約束(期望它要慢得多)一樣慢。更快的唯一可能性是確保您的應用程序沒有任何錯誤,並且不會創建丟失的引用。由於某些原因,這太難了:

請考慮以下情形:表A有一個引用表B的列,一位用戶在B中插入一行,並且任何人在A中使用它之前決定刪除它。同時,另一個用戶已經打開了A的插入表單,該表單中有一個組合框填充了B行。當他保存這個A時,它可以引用一個錯誤的B,並且我沒有看到自然的體系結構來阻止這個,可以可能更快的關係本身。

我可以如你所願儘可能多的例子下去,但總之,我的應用程序體系結構的經驗說,保持儘可能多的架構級約束地,並有更多的時間與家人在一起!

3

除了其他人所說關於數據的一致性和查詢性能...

具有外鍵在數據庫中也documentation--你不需要通過你的代碼庫翻找了解如何表格應該涉及。隨着數據庫中表的數量增加或者觸及該數據的應用程序數量增加(或者您無法訪問代碼並且仍然需要理解數據),這變得更加重要。