说我有一个小组:
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个组的一部分,这会改变吗?
答案 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
}
'名称'将包含指定组中的所有成员