Lite_stream
@Lite_stream

Array of embedded documents vs Foreign key?

Имеется 2 коллекции: Users и Comments. Users имеет N документов, а Comments вложена в Users (то есть Users = {..., [Comments], ...} - массив комментариев) и имеет в среднем M документов для каждого документа Users. У Comments есть индексированное поле Views.
Требуется найти все комментарии, имеющие, скажем, 200 просмотров.
Сложность для каждого из 2-х подходов:
1.Comments встроен в Users, как и описано выше, тогда сложность будет N * LogM. То есть нужно просмотреть каждого пользователя - N итераций, а затем пробежаться по дереву Views - LogM
2.Comments существует автономно и его док-ы имеют ссылку - ObjectID на док. Users (классический one-to-many). Тогда Comments будет иметь N * M док-ов, а сложность будет Log( N * M ).
Вывод: если требуется фильтровать по полям вложенных док-ов, то стоит реализовать коллекции не как вложенные, а в виде отдельной коллекции, как в РБД.
Правильно ли я оценил сложность ? Если да, то какие юзкейсы у массивов вложенных документов перед РБД подходом, описанным в пункте 2?
  • Вопрос задан
  • 394 просмотра
Пригласить эксперта
Ответы на вопрос 1
@lega
Вывод: если требуется фильтровать по полям вложенных док-ов, то стоит реализовать коллекции не как вложенные, а в виде отдельной коллекции, как в РБД.
Чаще да. Так же бывают такие варианты как пометить определенных пользователей чтобы всех не перебирать, либо дублировать "отличительные" комментарии в отдельную коллекцию или наоборот дублировать в "документ пользователя", в nosql оно гибче.

N * LogM. То есть нужно просмотреть каждого пользователя - N итераций
Чтобы не делать N итераций используют индекс, чтобы получить нужные документы без переборов (а переборы задействуют "диск").

Так же тут нужно смотреть на то как вы будете изменять поле "количество просмотров", если комментарии находятся в отдельной коллекции - то это будет проще и быстрее.

Comments будет иметь N * M док-ов, а сложность будет Log( N * M ).
Откуда у вас тут Log? Чтобы получить "все комментарии имеющие 200 просмотров.", коллекцию пользователей трогать вообще не обязательно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы