我正在爲基於Web的應用程序構建一個新數據庫,並發現我經常必須在模型的靈活性和有意義的外鍵之間做出決定,以實施參照完整性。使用觸發器而不是外鍵強制引用完整性
有一對夫婦設計的方面,導致我對寫作觸發做什麼FKS通常會做:
模型的部件使用數據表的Class Table Inheritance Pattern和一些有對象ID其基礎類型應限制爲對象類型的一個子集。這在觸發器中很容易實現,但在FK中不可能不會使數據模型複雜化。
該數據庫具有非常靈活的參考數據模型,允許最終用戶使用新字段自定義其數據庫實例(每個客戶端都有自己的數據庫),並擴展常用字段的預定義值列表。起初,我有一百個具有完全相同架構(ID,名稱)的小表,但已經將它們整合到一個表(FieldID,ID,Name)中。再次,這將是非常簡單的觸發器來檢查,但不可能在FK
其他一些細節:
- 正如上面提到的,每個客戶都會有自己的數據庫 副本
- 每個數據庫的大小不可能很大。也許某處10 - 50 GB範圍
- MS SQL 2008
這是否聽起來想法合理?還是有一些我沒有想到的巨大陷阱?我將創建外鍵的原因是強制執行數據完整性並防止孤行。只要這個目標完成了,手段應該不重要,對嗎?
編輯:我覺得我應該澄清,我不打算使用觸發器執行所有參照完整性檢查。當我可以的時候,我會使用一個外鍵。我的模型中只有幾個區域,我不能。我很欣賞迄今爲止的深思熟慮的答案。
剛問... http://stackoverflow.com/q/3981735/65223 – 2010-10-20 20:03:37
如果您開始使用[快照隔離],則可能會出現一個潛在的錯誤(http://sqlblog.com/blogs/hugo_kornelis/archive/ 2006/07/26/134.aspx) – 2010-10-20 20:54:15