2009-10-05 61 views
0

我有我存儲樹排序的等級像這樣的兩個表刪除/更新:如何插入/有序樹

Table: TreeData 
--------------- 
ID (int) (primary key) 
Data (string) 
Level (int) (not null) 


--------------------------------------------- 
Table: SubTree 
--------------- 
parentID (int) (foreign key #1 to TreeData.ID) 
childID (int) (foreign key #2to TreeData.ID) 
orderNumber (int) (not null) 

現在讓我們說在一定程度上1,我有2個TreeData與ID的1 2和0一Treedata項ID爲0的孩子,在邏輯順序的條目:

TreeData      SubTree 
ID  Level    parentID childID  orderNumber 
---------------    ----------------------------------- 
0   0     
1   1     0   1   1 
2   1     0   2   2 
3   1     0   3   3 

現在我有一些數據,我想在1級的數據庫中插入,作爲兒童父0但「1」和2之間的「之間」,因此數據庫像這樣結束:

TreeData      SubTree 
    ID  Level    parentID childID  orderNumber 
    ---------------    ----------------------------------- 
    0   0     
    1   1     0   1   1 
    2   1     0   2   3   <-- order increased 1 
    3   1     0   3   4   <-- order increased 1 
    4   1     0   4   2 

在手,我需要基座,其中,新數據進入數據如下:

Data (string) // the data itself 
Level (int) // the level it needs to be on 
parentID (int) // the id of the parent 
reference_orderNumber (int) // reference to the ordernumber 'this' data 
          // needs to come before or after 
placement (string) // either "before" or "after" 
        // in case of "after" the order number of 'this' data 
        // should be reference_orderNumber +1 
        // in case of "before" the order number of 'this' data 
        // should be equal to reference_odrderNumber 

在哪裏,我應該如何實現呢?

SQL服務器(我正在使用MS SQL Server 2008 Developer Edition)能夠執行此次排序嗎? (在這種情況下,我認爲這將是最快的方法)

或者我真的需要通過linq2sql獲取更高順序的數據的所有數據,更新它在我的C#代碼中,並將其全部放回SQL服務器?

如何: 移動電平內的一些數據(從ordernr 2至4,SO 4變爲3和3變爲2)

刪除(與ORDERNUMBER 2刪除,所以3變爲2和4變爲3)

移動數據以外的級別(從orderr 2(所以4變成3和3變成2)1級到更高/更低級別,以便級別需要重新排序)?

回答

0

這可能是一個附註,但你可能不想在SQL和C#中都做邏輯。把它放在一個地方,它會更容易維護。如果你確實需要額外的速度,你可能會或可能無法通過快捷方式離開它,這是一個例外。

+0

在我的實際設置中有一些遞歸正在進行,這對數據庫/應用程序交互已經非常沉重。所以是的,我希望每一步都儘可能快地執行,並且花費最少的開銷:) – ArjanW 2009-10-05 18:07:36

+0

如果有其他開發人員需要閱讀和理解代碼,請謹慎行事? :-) – 2009-10-05 18:59:00