2010-08-31 55 views
3

應用程序在更新時會出現錯誤或獲取錯誤,某些隱藏的錯誤會在幾個月或幾年後檢測到,生成孤立的記錄,甚至在使用正確的測試套件時都無處指向等等。 Alluring Rails不會在數據庫級別實施參照完整性 - 由於其他地方討論的一些很好的理由,它將保持這種狀態 - 擁有可以檢查數據庫是否處於一致狀態的工具仍然很不錯。有沒有Rails驗證數據庫參照完整性的工具?

由於模型描述了「應該是什麼」,離線工具不可能驗證所有數據的完整性。它可以在備份數據之前定期運行,或者爲了開發人員的良好睡眠。

有沒有這樣的事情?

回答

0

如何使用DBMS來強制RI?你不需要Rails來爲你做。

+0

ActiveRecord(在rails中使用的ORM)默認不支持這項功能 – f0ster 2013-05-07 21:47:17

+0

當然,但爲什麼要讓一個軟件工具的限制阻礙您的數據完整性需求呢?使用一些更好的工具。 – sqlvogel 2013-05-08 05:41:31

2

我不知道這樣的工具。至少你已經意識到參照完整性危害的危險。那麼爲什麼讓自己受苦?正如dportas所建議的,首先使用外鍵引用。

要遷移使用它,添加如下內容:

execute('ALTER TABLE users ADD FOREIGN KEY (language_id) REFERENCES languages(id)') 

,使用戶的LANGUAGE_ID列中的語言引用表中的有效行。

根據您的DBMS,這甚至會自動爲您創建索引。還有一些rails的插件(檢出pg_on_rails),它們爲這些任務定義了易於使用的別名函數。

僅在備份文件上檢查完整性是沒有意義的,因爲錯誤已經發生,那麼您的數據可能已經混亂了。 (我去過那裏) 另一方面,如上所述,當使用外鍵約束時,每一個操作都會破壞整體性。

想象一下,當你感到疼痛(=正在進行手術)時,要去看牙醫,並用一種​​神奇的牙膏一次性刷牙,以保證你的牙齒在你的餘生中都會很好。

要考慮的另一件事:應用程序中的錯誤將更容易找到,因爲在嘗試插入損壞的數據的代碼中會引發異常。

所以請使用外鍵約束。您可以輕鬆地將這些語句添加到您現有的數據庫。