2016-06-07 59 views
1

我見過像discourse這樣的示例,其中關係數據庫中的表沒有外鍵。儘管RDB的其他租戶仍然像CONSTRAINTS,INDEXES,FULLTEXTSEARCH等一樣使用。但按照Rails Active記錄準則,外鍵會被丟棄。確保與沒有外鍵的關係數據庫的一致性

https://meta.discourse.org/t/foreign-key-constraints-in-db/2642

我們是否需要在此類應用中定期檢查的一致性?在這種情況下,應該爲每個請求執行 - 響應中沒有無效的外鍵,並在應用程序層同時更正它。

回答

4

好的,首先要明白的是爲什麼我們通常會將這些約束放在數據庫中。第二點將是爲什麼有些人不喜歡這樣。第三將是不這樣做的後果。

爲什麼我們把RI檢查數據庫

一個關係數據庫基本上是一個很大的數學引擎執行一套(當然,實際上袋,由於與現實世界的數據完整性問題讓步)操作上的大集數據的。隨着集合的增長,驗證數據完整性的能力會降低,直到在某個時刻,人們無法根據隨後設置的模型驗證數據的整個有效性。我曾經在PostgreSQL數據庫中工作過,因爲在這些數據庫中不可能存在約束,所以在某些領域我們不得不接受將會存在參照完整性違規的問題。

在一個軟件項目擁有數據庫的情況下管理參照完整性的問題可能非常艱鉅,但是當許多不同的程序可以讀取或寫入相同的數據時,它們可能變得更糟。這種情況變得更糟,因爲規範化和封裝問題隨着讀取(甚至寫入)數據的路徑數量的增加而增加。

確保每次寫入時都不會違反參照完整性,這是數據管理中的重要工具。

爲什麼有些人避免在數據庫RI檢查

參照完整性約束但不是免費的。使用它們有兩個重要的缺點,有時會導致開發人員決定不這樣做。

  1. 參照完整性檢查不是免費的。它們確實會影響數據庫性能,並且通常將數據庫理解爲系統中可伸縮性最低的部分,並且它們劃分邏輯,將其放置在不同位置並將數據模型邏輯與應用程序邏輯分開。雖然這種關注的分離通常是需要的,但在單個應用程序擁有數據庫的情況下,它有時(但並非總是)被認爲是不太理想的折衷。

值得注意的是,Rails的指導方針在這個折衷方面沒有提供可靠的指導。和許多ORM一樣,Active Record提供了在應用程序中解決這個問題的工具,我發現很多人在數據庫中使用外鍵的例子,沒有人說「不要使用它們。「

從避免RI檢查關注在數據庫

所關注的問題,當然,進一步的緩解措施取決於importanc和進一步使用的數據。較低的衝擊數據集,其僅僅是私有數據存儲的應用程序(普通的Rails方式)與後來用於決策支持的較高影響的數據存儲沒有相同的含義。因此,重複讀取使用是決定是否需要定期重新掃描

第二個問題是備用寫入源,通常在這個模型中,最重要的關心的是防止這些特定的ActiveRecord使用類的使用以外的其他寫入源。

所以在回答你的問題時,你可能會也可能不需要。但你應該做一個風險評估並決定要做什麼。這樣的風險評估不僅會在現在而且將來指導這一決定。

作爲一個側面說明

您可以使用外鍵來堅持一致性,同時使用掛鉤等等,以確保邏輯在ActiveRecord的成分妥善處理。即而不是使用ON DELETE CASCADE有一個鉤子處理。