2011-11-22 55 views
1

Ola,我正在將一箇舊的國家/地區/位置數據庫結構重構爲分層表。保持HierarchyID是最新的

我將使用新表的主鍵和自參考PARENTID列(主鍵)作爲一個HIERARCHYID列的基礎。因此

我的表如下所示:

PK名稱PARENTID HIERARCHYID

1世界NULL/

2英國1/1/

3維岡2/1/2

我的問題是:當創建記錄或記錄的父項變更時,其他人實施了哪些方法來保持層次結構列的最新狀態ED?

注意;我正在使用LINQtoSQL(我使用計算的hierarchyid.ToString()列來暴露代碼中的沿襲,加上存儲過程給我hierarchyid查詢的性能好處)。

對於插入/更新管理:

我已經考慮覆蓋在LINQtoSQL插入/更新程序爲我的新表。

我已經考慮使用存儲過程來管理更新/插入新記錄。

在插入/更新以基於ParentID執行更新後,我考慮了遞歸觸發器。

我還沒有做出決定哪個課程!

有沒有人使用這些方法來管理hierarchyids?有沒有更好的方法,我沒有考慮過,或者我錯過了真正明顯的東西!!??

回答

1

我剛剛做了一個類似的項目,我用存儲過程來處理id管理。如果你正在做一些簡單的查詢,LINQ很酷,但是它在調試和維護數據模型時會帶來困難。

好部分有關使用存儲的過程,就是它抽象從應用層的ID的管理,使得開發人員不需要了解底層數據庫模型(一個或多個)。同樣,在糟糕的一面,它會從應用程序層中抽象出id管理,這樣開發人員就無法理解底層數據庫模型,而無需進入數據庫並查看存儲的proc。

使用數據庫觸發器可能是最好的解決方案,但我決定不去那樣做,因爲它會增加另一個抽象層次。這是因爲它進一步混淆了真實的數據流程,留下了另一個地方尋找可能試圖弄清楚它是如何工作的人。

底線是,你應該強制執行的方式,是在你的系統是一致的(或您的項目,至少是)你的引用完整性。

+0

感謝您的建議,我會堅持我認爲的一個問題。我有一個RefreshLocationHierarchy sproc,它使用一個hierarchyid重新加載整個表的數據。這將在所有更新和插入之後調用(這不會那麼頻繁)。 – Oliver