1

参照ドキュメントを含めて往復を避けるために、次のサンプル コードを検討しています。

var order = session.Query<Order>()
   .Customize(x => x.Include<Order>(o=>o.CustomerId)) // Load also the costumer
   .First();
var customer = session.Load<Customer>(order.CustomerId);

私の質問は、レイヴンはこれがドキュメント/コレクションをo=>o.CustomerId意味することをどのように知っているのでしょうか? エンティティを取得するためのクエリでCustomerエンティティが提供されたことは一度もありませんでした。それでも、Raven は、取得する 2 番目のクエリは、ネットワーク トリップなしでキャッシュに対して実行できると主張しています。CustomerOrderCustomer

採用するのが非常に貧弱/壊れやすい/脆弱な規則のように思われる命名規則によるものである場合、複数のドキュメントを含める必要がある場合はどうなりますか?

例えば。車は 2 人の名前で購入されたので、2 人の顧客 (1 番目と 2 番目の顧客/ドライバー) にリンクしたいと思います。どちらも Customer コレクションに格納されています。

var sale = session.Query<Sale>()
   .Customize(x => x.Include<Sale>(o=>o.PrimaryCustomerId).Include<Sale>(o=>o.SecondaryCustomerId)) // Load also the costumer
   .First();
var primaryCustomer = session.Load<Customer>(order.PrimaryCustomerId);
var secondaryCustomer = session.Load<Customer>(order.SecondaryCustomerId);

1回のネットワークトリップで上記を行うにはどうすればよいですか? 明らかにプロパティ名とコレクション名が一致しないため、Raven はこれが 1 つの同じテーブルへの参照でo=>o.PrimaryCustomerIdあることをどのように知るのでしょうか?o=>o.SecondaryCustomerIdCustomer

4

1 に答える 1

2

Raven には「テーブル」という概念がありません。「コレクション」については知っていますが、それらは単なる便利なメカニズムです。舞台裏では、すべてのドキュメントが 1 つの大きなデータベースに保存されています。「コレクション」を作成する唯一のことは、各ドキュメントにRaven-Entity-Nameメタデータ値があることです。

あなたが示した両方の例は、1回の往復(それぞれ)になります。あなたのコードは私にはうまく見えます。

o=>o.CustomerId私の質問は、これが顧客のドキュメント/コレクションを意味することを Raven がどのように認識しているのかということです。Order エンティティを取得するためにクエリでエンティティ Customer が提供されたことは一度もありませんでした。

クエリで指定する必要はありません。CustomerIdドキュメントのフィールドに格納されたデータSaleが完全なドキュメント キーである限り、そのドキュメントはクライアントに返され、セッションにロードされます。

それでも Raven は、Customer を取得するための 2 番目のクエリは、ネットワーク トリップなしでキャッシュに対して実行できると主張しています。

そのとおりです。セッション コンテナは、クエリ結果からのドキュメントだけでなく、返されたすべてのドキュメントを追跡します。後でsession.Load同じドキュメント キーを使用して呼び出すと、既にセッションにあるため、サーバーに戻る必要はありません。

クエリ、ロード、またはインクルードのいずれを行うかに関係なく、ドキュメントは、セッションからプルするまで、静的な型に逆シリアル化されません。そのためCustomer、呼び出しで型を指定しsession.Load<Customer>ます。

それが命名規則によるものである場合、これは採用するのが非常に貧弱/壊れやすい/脆弱な規則のようです...

いいえ、などのドキュメント キーであるプロパティに格納されている"customers/123"によるものです。すべてのドキュメントは、クラスの静的な型を知っているかどうかに関係なく、そのドキュメント キーによってアドレス指定できます。

複数のドキュメントを含める必要がある場合はどうなりますか?

まったく同じこと。セッションに含めたりロードしたりできるドキュメントの数に制限はありません。usingただし、適切に破棄されるように、必ずステートメントでセッションを開く必要があります。セッションは「Unit of Work コンテナー」です。

明らかにプロパティ名とコレクション名が一致しないため、Raven はこれが 1 つの同じテーブル Customer への参照でo=>o.PrimaryCustomerIdあることをどのように知るのでしょうか?o=>o.SecondaryCustomerId

繰り返しますが、フィールドの名前が何であるかは問題ではありません。これらのフィールドのデータに などのドキュメント ID が含まれていることが重要です"customers/123"。完全な文字列識別子を保存しない場合は、ラムダ式内にドキュメント キーを作成する必要があります。つまり、Sale.CustomerIdに数字だけが含まれている場合は123、 とともに含める必要があります.Include<Sale>(o=> "customers/" + o.CustomerId)

于 2013-08-21T03:03:57.520 に答える