Mitt farovite trick för att hantera trädstrukturerad data i databasen är att lägga till en kolumn FullID
till tabell för att undvika komplexa (kanske rekursiva) SQL:er/lagrade procedurer.
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
Så för att hitta rotsidans ID, extrahera bara den första delen av FullID
via SQL eller ditt applikationsspråk.
Om du använder SQL kan du använda följande SQL för att få root-id.
-- 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
Att radera en nod och dess underordnade
DELETE table WHERE id=<CURRENT_NODE_ID> OR FullID LIKE '<CURREN_NODE_FULLID>.%'
För att flytta en nod och dess barn
-- 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>.%')
Obs
Det här tricket tillämpas endast på begränsade fall på trädnivå, eller FullID
kan inte hålla långt innehåll om trädnivån är för djup.