Как мне вставить / удалить / обновить в упорядоченном дереве - PullRequest
0 голосов
/ 05 октября 2009

У меня есть две таблицы, в которых я храню дерево с упорядоченными уровнями, как это:

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 с идентификаторами 1 2 и все дочерние элементы записи Treedata на 0 с идентификатором 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?

Как насчет: Перемещение некоторых данных внутри уровня (от порядка 2 до 4, поэтому 4 становится 3, а 3 становится 2)

Удаление (удаление с порядковым номером 2, поэтому 3 становится 2, а 4 становится 3)

Перемещение данных за пределы уровня (из порядка 2 (то есть 4 становится 3, а 3 становится 2) уровня 1 на более высокий / более низкий уровень, так что уровень необходимо переупорядочить)?

1 Ответ

0 голосов
/ 05 октября 2009

Это может быть дополнительная информация, но вы, вероятно, не хотите делать логику как в SQL, так и в C #. Держите это в одном месте, и это будет легче поддерживать. Исключением может быть, если вам действительно нужна дополнительная скорость, которую вы можете или не сможете выбрать из нее, используя ярлык.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...