6

Datomic では、「ワシントンに住む 50 歳以上の人をすべて検索する」(都市と年齢は異なる場合があります) などのクエリを効率的に実行するにはどうすればよいですか? リレーショナル データベースとほとんどの NoSQL データベースでは、この目的のために複合インデックスを使用します。私が知る限り、Datomic はこのようなものをサポートしていません。

たとえば、中規模の Web アプリをいくつか作成しましたが、複合インデックスがなければ、十分に高速に実行できるアプリは 1 つもありませんでした。Datomic ユーザーはこれにどのように対処していますか? それとも、これに悩まされないほど小さなデータセットで遊んでいるだけですか? 何か不足していますか?

4

3 に答える 3

3

この問題とその解決策は、Datomic のデータ (datoms) の構造により、Datomic では同一ではありません。これに陰影を加える可能性のあるパフォーマンス特性/戦略が 2 つあります。

(1) Datomic でデータをフェッチするときは、インデックス ツリーからリーフ セグメント全体 (個々のアイテムではなく) をフェッチします。セグメントは潜在的に何千ものデータで構成されています。これは自動的にキャッシュされるため、ネットワーク経由でさらにデータを取得する必要はありません。

1 人の人物 (つまり、1 つのエンティティ) の年齢と住んでいる場所についてクエリを実行している場合、クエリの EAVT または AEVT インデックスのナビゲーションによって、必要なものがすべてキャッシュされている可能性が非常に高くなります。データム、それに移動する方法、および関連するデータム (インデックス内の局所性による) を効果的にキャッシュしました。

(2)パーティションは、参照の局所性を指定する手動の手段を提供できます。パーティションはエンティティ ID の値 (上位ビットでエンコードされます) に影響を与え、関連するエンティティが互いに近くに並べられるようにします。したがって、上記の問題の別の実装として、city エンティティと person エンティティの両方からの情報が必要な場合は、それらを同じパーティションに含めることができます。

于 2014-12-16T23:51:44.523 に答える
2

これを処理するライブラリを作成しました: https ://github.com/arohner/datomic-compound-index

于 2015-03-31T23:10:42.537 に答える