0

現在、db4oでは、コレクションのコンテンツに対するインデックス作成は許可されていません。データベース内の個々のフィールドのインデックスを作成できるオブジェクト データベースはどれですか?

例:

class RootClass
{
   string thisIsIndexed; // Field can be indexed for quick searching.
   IList<SubClass> contentsNotIndexed = new ArrayList(); // Creates a 1-to-many relationship.
}

class SubClass
{
   string thisIsNotIndexed; // Field cannot be indexed.
}

db4o がフィールド「thisIsNotIndexed」で検索するには、完全なオブジェクトをメモリにロードしてから、LINQ-to-Objects を使用してフィールドをスキャンする必要があります。これは、検索を行うためにデータベース全体を RAM にロードする必要がある可能性があることを意味するため、低速です。これを回避する方法は、検索するすべてのフィールドをルート オブジェクトに含めることですが、これは人為的な制限のように思えます。

この制限を受けず、サブオブジェクト内の任意の文字列のインデックス作成を許可するオブジェクト データベースはありますか?

アップデート

答え #1:

使いやすさ (階層構造) と、ツリー全体の完全なインデックス作成を使用した驚くほど高速なネイティブ クエリという、両方の長所を活かす方法を見つけました。これには、ちょっとしたトリックと、親ノードのコンテンツをキャッシュするメソッドが含まれます。

  1. 通常どおり、ネストされた階層を作成します。
  2. サブノードごとに、ノードの親への逆参照を作成します。
  3. 葉ノードを照会できるようになりました。途中まで到達しました - クエリを実行できますが、親ノードのパラメーターで検索する場合、ツリー ノードを上に移動するために結合を実行する必要があるため、処理が遅くなります。
  4. 高速化するには、検索語を親ノードにキャッシュする「キャッシュ」パラメーターを作成します。最初にnullに設定されているメソッドで、最初に呼び出されたときに高価な結合を行い、次にフィールドをミラーリングし、その時点から検索が非常に高速になります。
  5. これは、変化することのないデータ、つまり経時的な温度サンプルに適しています。データが変更される場合、ルート ノードの値が変更された場合に、キャッシュされた値をクリアする何らかの方法が必要です。たとえば、各リーフ ノードに「ダーティ」フラグを設定するなどです。

答え #2:

リストの代わりに配列を使用すると、SODA を使用して子ノードに降りることができます。リストを使用する場合、SODA はそれをサポートしていないため、SODA (または、LINQ、QBE、ネイティブ クエリなど、SODA に依存するもの) を使用してクエリを実行することはできません。

4

2 に答える 2

2

さて、あなたの例では SubClass.thisIsNotIndexed にインデックスを付けることができます。したがって、サブクラスのインスタンスをすばやく見つけることができます。

しかしもちろん、コレクションにインデックスを付けることができないという点であなたは正しいです。つまり、コレクションに特定の要素などが含まれている場合、効率的なクエリを実行することはできません。たとえば、特定のサブクラスを含むすべての RootClass に対してクエリを実行する場合などです。適切なコレクションのインデックス作成がないため、その場合は遅くなります。

db4o では、この問題を回避する必要があります。例として、親への参照を含むサブクラスにフィールドを追加します。その後、クエリを効率的に実行できます。

もう一つの小さなこと。コレクション フィールドにインデックスを設定できます。しかし、それはコレクション オブジェクトへの参照の単なるインデックスです。これにより、特定のコレクション インスタンスへの参照を持つオブジェクトを見つけることができます。それは通常かなり役に立たない。

大規模なオブジェクト データベースは、コレクションのインデックス作成とそれに伴うクエリをサポートしていると思います。

于 2011-02-26T19:47:08.517 に答える
1

これは、Scala および Java で DB40 を使用した経験に基づいていますが、これがまだ有効であることを願っています。これらのリストの内容を効率的に照会したい場合は、リスト内で見つけると予想されるオブジェクトにインデックスを定義し、「contentsNotIndexed」フィールドの下の ArrayList に照会する必要があります。私は ArrayList の内部構造を知りませんが、それがどこに降りてくるかを示唆しています。

必要に応じて、必要な効果を得るために、場合によっては ArrayList の代わりに配列を使用するようにクラスを設計することもできます。

于 2011-02-26T13:13:17.890 に答える