0

次のエンティティが与えられた場合

public class Device
{
    public string Id { get; set; }
}

public class User
{
    public string Id { get; set; }

    public IList<Device> Devices { get; set; }
}

ID でデバイスをクエリする必要があります。デバイス ID は一意です。デバイスは常に 1 人のユーザーに属します。

デバイスも別のドキュメントとして保存する必要がありますか、それともユーザーに対するマップ削減機能は「大丈夫」ですか? 特定のデバイスに頻繁にアクセスする必要があります (その間にキャッシュがあるかもしれませんが)?

ヒント、提案、またはベストプラクティスはありますか?

4

1 に答える 1

1

デバイスを個別のドキュメントとして独自のコレクションに保存する場合、デバイスの ID がわかっているため、クエリを実行する必要はまったくありません。より高速な Load メソッドを使用できます。

それらを別々のドキュメントとして保存する場合は、削除と更新の一貫性について考える必要があります。たとえば、デバイスが削除された場合、このデバイスを持っていたすべてのユーザーも見つけて参照を削除する必要があります。

ユーザーに対して map-reduce インデックスを作成しても意味がありません。reduce 関数は map 関数の出力に対する group by と考えてください。map 関数と reduce 関数の出力の形状も同じでなければなりません。デバイスのインデックスを取得するには、何によってユーザーをグループ化しますか?

一方、それらをユーザーのみに保存する場合は、ユーザー インデックスにデバイス ID のフィールドを作成し、特定のデバイス ID を持つユーザーをクエリして、デバイスを取得することができます。ユーザー文書。

public class UsersIndex: AbstractIndexCreationTask<User>
{
    public UsersIndex()
    {
        Map = docs=> from doc in docs
                     select new 
                     { 
                         DeviceIds = doc.Devices.Select(x => x.Id)
                     };
    }
}

var device = DbSession.Advanced.LuceneQuery<User, UsersIndex>()
                      .WhereEquals("DeviceIds", 123)
                      .Select(x => x.Devices.SingleOrDefault(d => d.Id == 123));
于 2013-04-11T07:37:44.170 に答える