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 是唯一的。设备始终属于一个用户。

我应该将设备也存储为单独的文档,还是对用户“好的”地图缩减功能?我需要经常访问特定设备(中间可能有缓存但仍然存在)?

任何提示或建议或最佳实践?

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 回答