Performance

觸發器和外鍵約束的成本?

  • March 27, 2019

我有一個由兩個程序訪問的 sqlite 數據庫。有許多不變數/約束應該始終保持。除了表之間通常的外鍵約束之外,還有一個表,一旦插入一行,就永遠不應該刪除該行,並且永遠不應該更改其中的幾個列。

編寫程序是為了維持這些條件。例如,沒有從上面提到的表中刪除的程式碼。

我還可以向數據庫添加觸發器,以通過中止違反它們的語句來強制執行所需的條件。這對我來說似乎是一個合理的想法,“腰帶和吊帶” - 明智的。它也是數據庫要求的一些附加“動態文件”。

我假設,但我找不到具體的證據,這些觸發器會增加最小的成本,因為它們永遠不應該被呼叫(為什麼它甚至會在 SELECT 或 INSERT 上查看 BEFORE DELETE 或 BEFORE UPDATE 觸發器?)。

我不太確定外鍵約束的可能成本,因為這些似乎會在每次插入/更新/刪除到其父表時檢查。

問題:

(1)觸發器/外鍵約束是否是一個好主意,即使我非常有信心我的程式碼永遠不會試圖違反它們?

(2) 我在哪裡可以獲得有關他們的成本的資訊?

觸發器/外鍵約束是個好主意嗎…

簡短的回答:是的。

…即使我非常有信心我的程式碼永遠不會試圖違反它們?

兩件事情:

首先,它並不總是“你的”程式碼。時代在變,人們繼續前進,事情發生了。如果其他人出現並“繼承”您的程式碼庫,您就不能“非常有信心”他們會像您一樣出色地完成工作。數據庫中的約束將保護它們不受自身影響。

其次,是什麼阻止有人連接他們最喜歡的 sqlite 客戶端並直接在數據庫中四處尋找?如果所有數據的完整性都在應用程序中完成,那麼“在雷達下”直接進入數據庫,繞過它並允許有人用完全垃圾填充數據庫,可能會在此過程中破壞應用程序。同樣,數據庫中的約束將保護它們免受自身影響。

我在哪裡可以獲得有關他們成本的資訊?

它被稱為測試。

雖然您可以獲得有關此類事情的一般建議,但您不會真正知道它如何影響您的數據庫,直到您在您的

$$ test $$數據庫。 在有和沒有約束的情況下對您的測試進行基準測試。看看差異(如果有的話)是否可以接受

$$ to you and your users $$.

引用自:https://dba.stackexchange.com/questions/233280