2009-05-06 19 views
4

私は現在、iPhoneのプロジェクトで、ローカルのsqliteデータベースに格納されている大量の階層データにアクセスする必要があります。より一般的な操作の1つは、ロールアップ状況フィールドを計算することです。今、私はそのアイテムの子孫すべてを再帰することでそれをやっています(1からnレベルの深さまで)。しかし、これは多くのSQL呼び出しを必要とします。 iPhone上の各sqlite呼び出しは250msで完了し、最終的には処理時間が約7.7秒になります。誰もO(n)時間未満でこのようなことをする提案はありますか?私は、問題の根本は、作成されている純粋な数のSQL呼び出しだと思うので、それを減らそうとしているのです。再帰的にsqliteで再帰的な計算を行う代わりに?

答えて

2

異なるテーブル構成が必要です。 Managing Hierarchical Data in MySQLまたはJoe Celko's bookをご覧ください。

+0

私はそれが1つの解決策であることに同意しますが、MySQLのページで与えたより複雑なSQLの例のいくつかは残念ながらsqliteでは動作しません。 ネストされたセットについての読者のアイデアは、特定のサブツリー(より複雑なクエリのようです)の下ですべてのリーフノード(非常に単純なクエリです)を見つけることでした。どのようにそれを達成するための任意のアイデア?それはすべての再帰を削除し、より多くのクエリではなく、メモリ内でロールアップ計算を実行させます。 –

+0

さて、私は私の答えを見つけたと信じています。クエリはかなりシンプルでした。親、ノード parent.category_id = 6、parent.lft + 1とparent.rgt BETWEEN node.lftポインタのための おかげでAS nested_category AS nested_category FROM SELECT node.name!今度は、885行の階層データをこの新しい入れ子形式に変換する方法を理解するだけです。しかしそれはまったく別の問題です。 –

+0

私は通常データベースの男ではない、私は1つを持ってうれしいです。 –