2009-10-05 22 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