データベース内のツリー構造化データを処理するための私のfaroviteトリックは、列FullID
を追加することです。 複雑な(おそらく再帰的な)SQL/ストアドプロシージャを回避するためにテーブルに移動します。
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
したがって、ルートページIDを見つけるには、FullID
の最初の部分を抽出するだけです。 SQLまたはアプリケーション言語を介して。
SQLを使用している場合は、次のSQLを使用してルート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
ノードとその子を削除するには
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
にのみ適用されます。 ツリーレベルが深すぎると、長いコンテンツを保持できません。