2010-10-20 31 views
0

我正在爲基於Web的應用程序構建一個新數據庫,並發現我經常必須在模型的靈活性和有意義的外鍵之間做出決定,以實施參照完整性。使用觸發器而不是外鍵強制引用完整性

有一對夫婦設計的方面,導致我對寫作觸發做什麼FKS通常會做:

  1. 模型的部件使用數據表的Class Table Inheritance Pattern和一些有對象ID其基礎類型應限制爲對象類型的一個子集。這在觸發器中很容易實現,但在FK中不可能不會使數據模型複雜化。

  2. 該數據庫具有非常靈活的參考數據模型,允許最終用戶使用新字段自定義其數據庫實例(每個客戶端都有自己的數據庫),並擴展常用字段的預定義值列表。起初,我有一百個具有完全相同架構(ID,名稱)的小表,但已經將它們整合到一個表(FieldID,ID,Name)中。再次,這將是非常簡單的觸發器來檢查,但不可能在FK

其他一些細節:

  • 正如上面提到的,每個客戶都會有自己的數據庫
  • 副本
  • 每個數據庫的大小不可能很大。也許某處10 - 50 GB範圍
  • MS SQL 2008

這是否聽起來想法合理?還是有一些我沒有想到的巨大陷阱?我將創建外鍵的原因是強制執行數據完整性並防止孤行。只要這個目標完成了,手段應該不重要,對嗎?

編輯:我覺得我應該澄清,我不打算使用觸發器執行所有參照完整性檢查。當我可以的時候,我會使用一個外鍵。我的模型中只有幾個區域,我不能。我很欣賞迄今爲止的深思熟慮的答案。

+0

剛問... http://stackoverflow.com/q/3981735/65223 – 2010-10-20 20:03:37

+0

如果您開始使用[快照隔離],則可能會出現一個潛在的錯誤(http://sqlblog.com/blogs/hugo_kornelis/archive/ 2006/07/26/134.aspx) – 2010-10-20 20:54:15

回答

0

使用觸發器來實現更復雜的參照完整性規則是可以的,但可能會讓新開發人員感到困惑,因此請確保它在內部有良好的記錄。

讓客戶定製他們的數據庫結構雖然要求麻煩。這很可能會導致維護問題。更好的選擇是創建一個可以容納任何數據的通用結構,例如鍵/值對的表。

+0

我同意這將是一場災難,他們不能改變結構,只能添加參考數據。參考數據表只是一個關鍵/值對的大型存儲庫。我允許用戶添加其他對以用於報告。新對必須是常見值的子類型,因此它不是完全敞開的。 – 2010-10-20 18:08:00

+0

@Mike Forman說:「我允許用戶在報告中添加額外的對。」您是否爲這些報告編寫了查詢?如果不是的話,你應該考慮在繼續這個模式之前嘗試去做這件事。如果您已經爲這些報告中的任何一個編寫了查詢,您是否使用任何大量數據運行它們? – 2010-10-20 18:17:59

+0

@KM - 還沒有,我在這個過程中還很早。我正在考慮在引用表中使用新的hierarchyid數據類型,以便我可以檢查父或父級的父級,或者在需要父級時只創建並維護一個額外的鍵/值。我知道這裏有一些醜陋的折衷,我試圖決定他們是否值得額外的靈活性。該模型確實解決了很多「我們應該把它放在哪裏?」問題,但如果有必要,我願意回到製圖板。 – 2010-10-20 18:50:42

2

從您的描述來看,觸發器隨着時間的推移會變得越來越複雜,並且最終會成爲噩夢來維護。

在我的職業生涯中,我不得不維護這種「ObjectId」數據模式,而我的經驗一直是負面的。隨着時間的推移,維護變得非常痛苦,執行有意義的查詢變得非常複雜。基本上你會做的是放棄一個「真實」的關係模型,用於某種元數據模型。

這似乎違反直覺,但維護一個適當規範化的關係模型,即使是具有多個表的一個模型,通常比維護元數據模型更容易。所有這一切說,如果我要去「ObjectId」路線,我會考慮在我的應用層中強制執行完整性,而不是使用觸發器。不利的一面是它可能會在系統中獲取不良數據(邏輯錯誤或人們通過SSMS手動輸入數據)。但是維護可能更易於管理。

2

沒有任何關於您的應用程序的邏輯或表結構的想法,我不能說比我說的經驗是,隨着數據模型的靈活性增加,查詢的複雜性會增加。這也帶來了性能上的痛苦。

此外,關於外鍵,我發現這...

原因定義外鍵約束

  • ,他們的身體,防止數據完整性問題定義業務 您的數據庫。 (例如,數據庫 在沒有現有訂單標題的情況下阻止訂單項的創建 )
  • 它們通過顯示所有數據如何與 彼此相關,從邏輯上記錄業務。對於剛剛參加 組織的人來說,這使他/她能夠很好地瞭解 業務的運作方式。 (例如,每個訂單 採取必須有一個有效的客戶 分配)
  • 外鍵是SQL Server本機,並旨在防止 數據完整性問題。業務邏輯 開發人員不應該在 業務中驗證表 的關係。
  • 如果已正確定義和編制索引,則SQL查詢引擎可以利用它們生成 極其高效的查詢計劃。

http://www.mssqltips.com/tip.asp?tip=1296

0

您使用的是關係型數據庫系統來存儲一組鍵 - 值對。這意味着您沒有使用關係系統的全部功能。如果您真的認爲鍵值對是存儲數​​據的最佳方式,那麼您應該考慮使用RDBMS以外的其他方法。顯然,數據庫技術不符合您的數據存儲需求。

您應該看看NoSQL和結構化數據存儲。

+0

請參閱http://en.wikipedia.org/wiki/Nosql – 2010-10-20 18:31:24