2011-05-31 9 views
0

データベース内のさまざまなツリーのノードに情報を保存したいと思います。SQLデータベースまたはNoSQLデータベースの小さなツリー構造がたくさんあります

まず、500個のツリー間で20000を超えるノードが共有され、各ノードには5つの番号属性が割り当てられます。いったん構築されると、各ノードはすべてのノードへの参照を必要とします。

初期化時にメモリにすべてのツリーを構築し、プログラムがダウンタイムになったら(おそらく毎時1時間程度かかります)、ノードを更新/追加する必要があります。

各テーブル(あまりにも多くのdb呼び出しを作成する必要があります)を作成するには時間がかかりすぎるようなSQL隣接モデルを見ましたが、ツリーを展開するためにはより複雑な可能性がある入れ子セットモデルこれは非常に起こりそうなことであり、非常に基本的な構造とクエリセットになる可能性があるため、データベースの複雑さが増します。

私もMongoDbを見てきましたが、JSON型のオブジェクトに合わせて作られているようですが、私はJavaを使用していますし、オーバーキルしている可能性もあります。巨大な将来に可能性があり、DBへの書き込み時間を増やすことも有益かもしれません)

私はこれについてどうすればよいでしょうか?

NoSQLのdbsオーバーキルはありますか?彼らは木構造を保管する方がはるかに優れていますか?それはサイドSQLデータベースに沿ってそれらを使用する貧しい習慣ですか?

答えて

1

(rgt - lft - 1)/2ネストされたセットに子プロパティの数が得られ、lft/rgtカラムにfloatを使用すると、最小時間でノードを挿入/更新/削除できます。

これを行うときの主な問題は、精度に関連する問題を避けることです。後者の場合は、lft/rgtに数値にキャストし、floatに戻って正準表現を得ることができます。 Postgresの持つ例:

select (.1::float + .7::float) * 10::float;       -- 8 
select floor((.1::float + .7::float) * 10::float);     -- 7 
select floor(((.1::float + .7::float) * 10::float)::numeric::float); -- 8 

他の問題は、管理が合理的に簡単で、あなたがスペースを使い果たしたときに発生します。あなたは、時折再インデックス部分や木の全てに必要 - それは木をロックする必要がありますが、それです通常の操作に影響を与えることなく実行できます。

1

SQL Server 2008+を使用している場合は、このようなシナリオで使用する新しいデータ型HierarchyIDを使用できます。

+0

Postgresで[整数配列](http://www.postgresql.org/docs/current/static/arrays.html)を使用するのと同じです。 :-) –

関連する問題