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?
  • Вопрос задан
  • 395 просмотров
Пригласить эксперта
Ответы на вопрос 1
@lega
Вывод: если требуется фильтровать по полям вложенных док-ов, то стоит реализовать коллекции не как вложенные, а в виде отдельной коллекции, как в РБД.
Чаще да. Так же бывают такие варианты как пометить определенных пользователей чтобы всех не перебирать, либо дублировать "отличительные" комментарии в отдельную коллекцию или наоборот дублировать в "документ пользователя", в nosql оно гибче.

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

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

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

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

Похожие вопросы