2009-09-15 33 views
1

我和我的朋友們互相爭論數據庫的設計。
他認爲,要確保複雜數據庫的完整性,最好使用觸發器。數據庫完整性:觸發器與鍵/限制

我相信爲此目的最好使用鍵(主鍵,唯一鍵)和約束。
我認爲使用觸發器是危險的,因爲它們在「幕後」工作,並且很難說出執行命令後會發生什麼。而且,如果觸發器有bug,它可能會破壞數據庫的完整性。

您對此有何看法?

+3

如果你問我,比較蘋果和橙子... – ChristopheD 2009-09-15 23:04:56

回答

9

「這是在話題的AskTom討論,沒有硬的問題快治(否則就不會有爭論!)......」

是的。聲明式總是比程序式執行更好。聲明不太容易犯錯誤。聲明性更容易維護。聲明式是比程序化實現更多的自我記錄。聲明式爲DBMS提供了最佳的優化場景,大多數情況下,DBMS比程序員更優化。

在程序上實現的唯一的好處是,它意味着對於那些誰是沒有一個真正的,如果聲明的約束可用,而不僅僅是可憐的PK + FK,我們從SQL找到工作。

+1

+1:我還會補充說,使用觸發器邏輯在多用戶環境中編寫參照完整性非常困難(因爲觸發器沒有看到其他會話的未公開數據)。 – 2009-09-16 09:33:11

6

你居然不說爲什麼你的朋友認爲他的想法,但是,在任何情況下限制/鍵是標準,規定和適當的方式,以確保數據的完整性,有兩個原因:

  • 每個人都知道他們,你會通過使用他們避免違反最小驚喜的原則。

  • 他們已經實施,測試和工作。

滾動您自己的數據完整性代碼沒有實際好處。觸發器用於其他用例,例如(例如)保存所有插入的日誌。

2

你並沒有說明具體的數據庫,但我會承擔的ANSI標準,關係數據庫管理系統,如Oracle或SQL Server。

我猜這取決於你的完整性。如果您只是試圖將孩子記錄和父母記錄集中在一起,並防止孤兒,那麼使用主鍵和外鍵約束的內置RI是要走的路。

如果您的RI更復雜,例如,如果父記錄中的字段1大於100,則子記錄中的字段2必須是< 200.必須使用觸發器。

我不會使用觸發器來執行簡單的RI,該輪已經被髮明。

0

我不認爲這是明確的方式或其他方式,但fwiw,我傾向於使用DRI約束來處理任何可以在DRI約束條件下完成的任務,併爲那些不可能的事情保存觸發器在DRI約束進行(如防止重疊dateranges)