У меня есть две таблицы, в которых я храню дерево с упорядоченными уровнями, как это:
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 на более высокий / более низкий уровень, так что уровень необходимо переупорядочить)?