1

私は次のSQLスキーマを持っています:

 CREATE TABLE Folders(
     id INTEGER PRIMARY KEY, 
     path TEXT NOT NULL, 
     level INTEGER DEFAULT 0,
     parentId INTEGER)

parentId!= NULLのアイテムはルートアイテムであり、「path」にフルパスがあります。サブフォルダは、名前と、ルートフォルダのどれだけ下にあるかを示すレベルによってのみ保存されます。ここで、このデータからすべてのアイテムのフルパスを作成します。

CTEはSQLiteで使用できないため、アイテムのフルパスをフェッチするために次のクエリを作成しました。

select f.id, ifnull(group_concat(p.path, '\')||'\', '')||f.path as path
  from folders f 
  left outer join (select * from folders order by parentId, level) p on (p.parentId=f.parentId or p.id=f.parentId) and p.level < f.level
  group by f.id

ただし、「explain」を使用して実行プランを見ると、これは非常に非効率的であるように思われます。parentId、path、levelでインデックスを作成しましたが、これはあまり改善されていないようです。

http://www.sitepoint.com/article/hierarchical-data-database/を確認しようとしましたが、リダイレクトの問題があります。

4

1 に答える 1

1

ルートと子の間のレベル数が可変である場合、それを行うことはできません。あなたがしたことは正しくなく、せいぜい直接の子供たちと一緒にルートに参加することができます。

階層データをテーブルにコーディングし、再帰クエリの必要性を回避するためのさまざまなソリューションがあります。たとえば、 https://communities.bmc.com/communities/docs/DOC-9902を参照してください。

解決策の1つはマテリアライズドパスを使用することであるため、実際に必要なのは、すべてのレコードにフルパスを設定することです。これにより、簡単なクエリで必要なデータが得られます。

于 2013-03-25T17:43:47.770 に答える