RavenDB - 多对多关系文档的索引是否比集合属性上的索引更有效?

时间:2018-06-06 03:29:07

标签: c# linq indexing lucene ravendb

说我有一个小组:

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个组的一部分,这会改变吗?

1 个答案:

答案 0 :(得分:1)

根据以下内容创建'群组'收藏:

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

根据以下内容创建'会员'收藏:

 class Member { int MemberId; string MemberName;}

然后在'Groups'集合上创建一个静态索引: 使用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
}

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