Моят фаровски трик за работа с дървовидни структурирани данни в базата данни е добавяне на колона FullID
към таблица, за да се избегнат сложни (може би рекурсивни) SQLs/съхранени процедури.
FullID id parent name
-----------------------------
1 1 null root1
2 2 null root2
2.3 3 2 home
2.3.4 4 3 child
2.3.4.5 5 4 sub_child
2.3.4.5.6 6 5 sub_sub_child
Така че, за да намерите идентификатора на основната страница, просто извлечете първата част от FullID
чрез SQL или езика на вашето приложение.
Ако използвате SQL, можете да използвате следния SQL, за да получите идентификатора на root.
-- MySQL dialect
select substring_index(FullID,'.',1) as RootID from table;
-- SQL Server dialect
select case charindex('.', FullID) when 0 then FullID else substring(FullID, 1, charindex('.', FullID)-1) end as RootID from table
За да изтриете възел и неговите деца
DELETE table WHERE id=<CURRENT_NODE_ID> OR FullID LIKE '<CURREN_NODE_FULLID>.%'
За преместване на възел и неговите деца
-- change the parent of current node:
UPDATE table
SET parent=<NEW_PARENT_ID>
WHERE id=<CURRENT_NODE_ID>
-- update it's FullID and all children's FullID:
UPDATE table
SET FullID=REPLACE(FullID,<CURRENT_NODE_PARENT_FULLID>, <NEW_PARENT_FULLID>)
WHERE (id=<CURRENT_NODE_ID> OR FullID LIKE '<CURRENT_NODE_FULLID>.%')
Забележка
Този трик се прилага само при ограничени случаи на ниво дърво или FullID
не може да задържи дълго съдържание, ако нивото на дървото е твърде дълбоко.