現在、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:
使いやすさ (階層構造) と、ツリー全体の完全なインデックス作成を使用した驚くほど高速なネイティブ クエリという、両方の長所を活かす方法を見つけました。これには、ちょっとしたトリックと、親ノードのコンテンツをキャッシュするメソッドが含まれます。
- 通常どおり、ネストされた階層を作成します。
- サブノードごとに、ノードの親への逆参照を作成します。
- 葉ノードを照会できるようになりました。途中まで到達しました - クエリを実行できますが、親ノードのパラメーターで検索する場合、ツリー ノードを上に移動するために結合を実行する必要があるため、処理が遅くなります。
- 高速化するには、検索語を親ノードにキャッシュする「キャッシュ」パラメーターを作成します。最初にnullに設定されているメソッドで、最初に呼び出されたときに高価な結合を行い、次にフィールドをミラーリングし、その時点から検索が非常に高速になります。
- これは、変化することのないデータ、つまり経時的な温度サンプルに適しています。データが変更される場合、ルート ノードの値が変更された場合に、キャッシュされた値をクリアする何らかの方法が必要です。たとえば、各リーフ ノードに「ダーティ」フラグを設定するなどです。
答え #2:
リストの代わりに配列を使用すると、SODA を使用して子ノードに降りることができます。リストを使用する場合、SODA はそれをサポートしていないため、SODA (または、LINQ、QBE、ネイティブ クエリなど、SODA に依存するもの) を使用してクエリを実行することはできません。