Rubyに大きなデータツリーを構築して格納する必要があるプロジェクトがあります。シリアライゼーション、デシリアライゼーション、ツリーのクエリなど、さまざまなアプローチを検討していますが、何が最善の方法になるのだろうかと思っています。私の主な制約は、読み取り時間、クエリの効率性、およびクロスバージョン/クロスプラットフォームの互換性です。最も頻繁な操作は、id/valueおよび/またはfeatureの組み合わせに基づいてノードのセットを検索することです。ツリーは、最大15〜20レベルの深さにすることができます。サブツリーを移動することは珍しいことですが、あまりにも多くの黒い魔法がなければ可能です。 Railsの統合は主要な関心事ではありません。以下の通り、私は心配ですいくつかの問題と一緒に私が考えたオプション、:Rubyでのツリーデータ構造の永続化
- 元帥木々、そして時に必要なメモリにロードし、木の成長に合わせてルビー(非効率でそれらを照会し、クロスバージョン互換性?
- YAMLを使用します(より多くのバージョン間互換性がありますが、効率が悪いです)
- 上記と同じですが、カスタムXMLパーサーを使用します(ツリーごとにオブジェクトをゼロから再作成する必要がありますロードされていますか?)
- ツリーをXMLにシリアル化し、XMLデータベース(Sednaなど)に格納し、XPathを使用してツリーをクエリします(このアプローチの経験はありません)。 h)、
- スキーマレスデータベースに格納されているツリーをクエリするために隣接リストを使用する(子孫を数えると効率が悪い)
- ディープツリーの最大文字列長をオーバーフィルする可能性がありますか?
- ネストされたセットを使用する(複雑なSQLクエリ?)
- array of ancestorsアプローチを使用しますか? MongoDBのページに基づいて効率を照会するという面では面白いようですが、私はこのアルゴリズムの真剣な議論を見つけることができませんでした。
あなたの経験に基づいて、どのアプローチが私が記述した制約に適合するでしょうか?私がXMLデータベースを探しているなら、このプロジェクトに適したものはありますか?私が見過ごした他のアプローチはより効率的でしょうか?御時間ありがとうございます。
カラム属性として関連するプロパティを持つレコードと、親ノードを参照する特別な前のカラムがない場合はnullとして記録されます。サブツリーは、結果セットが疎であり、可能な限り最大のツリー深度が束縛される場合、いくつかのSQL方言、ストアド・プロキシまたは自己結合で使用可能な再帰的問合せ構成を使用してアセンブルできます。サブツリーを移動するということは、与えられた値の前の列を更新することを意味します。 xml reps&xpath式へのマッピングは簡単です。 – collapsar
リレーショナルデータベースにツリーを格納することを検討しているため、SQLタグがありますか? –
そうですよ!リレーショナルデータベースにツリーを保存した経験があるので、あなたは尋ねていますか? :) – user2398029