RavenDB - Является ли индекс документа отношения многих ко многим более эффективным, чем индекс свойства коллекции? - PullRequest
0 голосов
/ 06 июня 2018

Скажем, у меня есть группа:

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 участников и 1000 групп, в каждой группе может быть около 100 000 членов, и каждый участник может входить в 10 групп.

С точки зрения дизайна первый вариант более желателен, но насколько эффективна индексация коллекции по сравнению с обычным индексом свойства?

Изменится ли это, если член может быть частью 100 или 1000 группвместо этого?

1 Ответ

0 голосов
/ 07 июня 2018

Создать ' Группы ' Коллекция на основе:

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
}

«Имена» будут содержать всех членов в указанной группе

...