Mon astuce farovite pour gérer les données structurées en arbre dans la base de données consiste à ajouter une colonne FullID
à table pour éviter les SQL/procédures stockées complexes (parfois récursives).
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
Donc, pour trouver l'identifiant de la page racine, il suffit d'extraire la première partie de FullID
via SQL ou le langage de votre application.
Si vous utilisez SQL, vous pouvez utiliser le SQL suivant pour obtenir l'identifiant racine.
-- 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
Pour supprimer un nœud et ses enfants
DELETE table WHERE id=<CURRENT_NODE_ID> OR FullID LIKE '<CURREN_NODE_FULLID>.%'
Pour déplacer un nœud et ses enfants
-- 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>.%')
Remarque
Cette astuce n'est appliquée que sur des cas limités au niveau de l'arborescence, ou le FullID
ne peut pas contenir de contenu long si le niveau de l'arborescence est trop profond.