我和我的朋友們互相爭論數據庫的設計。
他認爲,要確保複雜數據庫的完整性,最好使用觸發器。數據庫完整性:觸發器與鍵/限制
我相信爲此目的最好使用鍵(主鍵,唯一鍵)和約束。
我認爲使用觸發器是危險的,因爲它們在「幕後」工作,並且很難說出執行命令後會發生什麼。而且,如果觸發器有bug,它可能會破壞數據庫的完整性。
您對此有何看法?
我和我的朋友們互相爭論數據庫的設計。
他認爲,要確保複雜數據庫的完整性,最好使用觸發器。數據庫完整性:觸發器與鍵/限制
我相信爲此目的最好使用鍵(主鍵,唯一鍵)和約束。
我認爲使用觸發器是危險的,因爲它們在「幕後」工作,並且很難說出執行命令後會發生什麼。而且,如果觸發器有bug,它可能會破壞數據庫的完整性。
您對此有何看法?
「這是在話題的AskTom討論,沒有硬的問題快治(否則就不會有爭論!)......」
是的。聲明式總是比程序式執行更好。聲明不太容易犯錯誤。聲明性更容易維護。聲明式是比程序化實現更多的自我記錄。聲明式爲DBMS提供了最佳的優化場景,大多數情況下,DBMS比程序員更優化。
在程序上實現的唯一的好處是,它意味着對於那些誰是沒有一個真正的,如果聲明的約束可用,而不僅僅是可憐的PK + FK,我們從SQL找到工作。
+1:我還會補充說,使用觸發器邏輯在多用戶環境中編寫參照完整性非常困難(因爲觸發器沒有看到其他會話的未公開數據)。 – 2009-09-16 09:33:11
你居然不說爲什麼你的朋友認爲他的想法,但是,在任何情況下限制/鍵是標準,規定和適當的方式,以確保數據的完整性,有兩個原因:
每個人都知道他們,你會通過使用他們避免違反最小驚喜的原則。
他們已經實施,測試和工作。
滾動您自己的數據完整性代碼沒有實際好處。觸發器用於其他用例,例如(例如)保存所有插入的日誌。
你並沒有說明具體的數據庫,但我會承擔的ANSI標準,關係數據庫管理系統,如Oracle或SQL Server。
我猜這取決於你的完整性。如果您只是試圖將孩子記錄和父母記錄集中在一起,並防止孤兒,那麼使用主鍵和外鍵約束的內置RI是要走的路。
如果您的RI更復雜,例如,如果父記錄中的字段1大於100,則子記錄中的字段2必須是< 200.必須使用觸發器。
我不會使用觸發器來執行簡單的RI,該輪已經被髮明。
我不認爲這是明確的方式或其他方式,但fwiw,我傾向於使用DRI約束來處理任何可以在DRI約束條件下完成的任務,併爲那些不可能的事情保存觸發器在DRI約束進行(如防止重疊dateranges)
如果你問我,比較蘋果和橙子... – ChristopheD 2009-09-15 23:04:56