我正在使用SQL Server 2008/LinqToSQL /定製存儲庫作爲DAL的多用戶互聯網數據庫驅動的網站。我遇到了一個規範化問題,如果正確利用,會導致數據庫狀態不一致,我想知道如何處理這個問題。如何避免此數據庫模式中的衝突數據?
問題:幾個不同的公司有權訪問我的網站。他們應該能夠在我的網站上跟蹤他們的項目和客戶。一些(但不是全部)項目應該分配給客戶。
這將導致以下數據庫模式:
**Companies:**
ID
CompanyName
**Clients:**
ID
CompanyID (not nullable)
FirstName
LastName
**Projects:**
ID
CompanyID (not nullable)
ClientID (nullable)
ProjectName
這導致以下關係:
Companies-Clients (1:n)
Companies-Projects (1:n)
Clients-Projects(1:n)
現在,如果用戶是惡意的,他可能例如插入一個項目他自己的CompanyID,但具有屬於另一個用戶的ClientID,導致數據庫處於不一致狀態。
問題以類似的方式發生在我的數據庫模式上,所以我想以通用的方式解決這個問題。我有以下兩種想法:
檢查可能導致DAL不一致的數據庫寫入。這是通用的,但在更新和創建查詢之前需要額外的數據庫查詢,因此會導致性能下降。
爲客戶 - 項目關係創建一個附加表並確保以此方式創建的關係是一致的。這也需要一些額外的選擇查詢,但遠低於第一種情況。另一方面,它不是通用的,所以從長遠來看,更容易錯過某些東西,尤其是在向數據庫添加更多表/依賴項時。
你會做什麼?我錯過了更好的解決方案嗎?
編輯:你可能想知道爲什麼Projects表有一個CompanyID。這是因爲我希望用戶能夠使用和不使用客戶端來添加項目。我需要跟蹤哪個公司(以及哪個網站用戶)屬於無客戶端項目,這就是爲什麼項目需要公司ID。
我認爲重點在於,如果沒有某種方法記錄數據庫中允許或不允許的內容,觸發器無法確定實際上有效的數據是否有意義。 – ninesided 2009-08-05 08:25:50
正是。我可能會嘗試在我的DAL中執行相同的操作,而不是使用觸發器,但我需要爲每個更新/插入/刪除操作添加一些額外的select查詢,這將導致我在上面提到的第一種可能的解決方案。 – 2009-08-05 08:37:19