【问题标题】:RavenDB - Is an index on a many to many relationship document more efficient than an index on a collection property?RavenDB - 多对多关系文档上的索引是否比集合属性上的索引更有效?
【发布时间】:2018-06-06 03:29:07
【问题描述】:

假设我有一个小组:

class Group {
    int Id
}

还有一个成员:

class Member {
    int Id
    List<int> GroupIds
}

任一 1) 成员可以拥有此 GroupIds 属性,并像这样查询

var groupMembers = session.Query<Member>().Where(m => m.GroupIds.Contains(groupId)

或者 2) 我可以定义一个 GroupMember

class GroupMember {
    int GroupId
    int MemberId
    //Extra information
}

var groupMembers = session.Query<GroupMember>().Where(m => m.GroupId == groupId)

我有大约 10,000,000 个成员和 1,000 个组,每个组可以有大约 100,000 个成员,每个成员可能属于 10 个组。

从设计角度来看,第一个选项更可取,但与普通属性索引相比,集合索引的性能如何?

如果一个成员可以成为 100 或 1000 个群组的一部分,这种情况会改变吗?

【问题讨论】:

  • 为什么不使用``` class Group { int Id;列出 MemberIds; } 类成员 { int Id; } ```
  • 我从它开始,但是 GroupMember 中的一些额外信息是 MemberName,我需要在没有加入的情况下快速使用它,并且有 100,000 个成员,文档的大小原来是 40mb ,很难下载

标签: c# linq indexing lucene ravendb


【解决方案1】:

根据以下条件创建“”集合:

class Group { int GroupId; List<string> MemberDocs; }

并根据以下条件创建“成员”集合:

 class Member { int MemberId; string MemberName;}

然后在“组”集合上创建一个静态索引: 使用 RQL 如:

from g in docs.Groups
select new {
   Group = g.GroupId,
   MembersNames = g.MemberDocs.Select(x => LoadDocument(x, "Members").MemberName)
}

将索引字段:'MembersNames'设置为STORED字段

然后您可以发出以下查询:

from index 'Members' as g
where g.Group = 'some_group_id'
select {
   Names:  g.MemberNames
}

'Names' 将包含指定组中的所有成员

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多