如何在有序树中插入/删除/更新

时间:2009-10-05 17:19:36

标签: sql linq-to-sql tree

我有两张表,其中存储了一个如下所示的有序级别的树:

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,并且Treedata条目的所有子项都在0,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,所以4变为3,3变为2)

删除(使用ordernumber 2删除,因此3变为2,4变为3)

将数据移出级别(从ordernr 2(因此4变为3和3变为2)级别1到更高/更低级别,因此需要重新排序级别?)

1 个答案:

答案 0 :(得分:0)

这可能是旁注,但您可能不希望在SQL和C#中都执行逻辑操作。将它放在一个地方,它将更容易维护。例外情况是,如果你真的需要额外的速度,你可能或者可能无法通过快捷方式摆脱它。