Будучи одним из самых популярных решений NoSQL, MongoDB имеет большинство преимуществ этого подхода. Но одна проблема, с которой я все еще сталкиваюсь, заключается в том, как отражать отношения объектов в хранилище данных NoSQL, в частности - MongoDB.
Например, рассмотрим простую модель данных: пользователь, сообщение и комментарий. Мне ясно, что комментарии не имеют ценности сами по себе и, таким образом, становятся встроенными объектами для сообщений. Но когда дело доходит до пользователей - это становится сложно, потому что Пользователь сам по себе является сущностью, а не связью с Post. Теперь, если мне нужно будет отображать сообщения с полными именами пользователей и ссылками на профили на веб-странице, мне нужно будет иметь список сообщений и информации об авторах сообщений (по крайней мере, имя и идентификатор).
Я вижу здесь 2 возможных решения:
- Де-нормализовать данные таким образом, чтобы каждая запись в записи содержала его идентификатор автора и полное имя (и любые другие атрибуты пользователя, которые могут потребоваться при публикации сообщений). Таким образом, я бы запросил данные очень просто, но когда пользователь обновляет свой профиль, мне нужно будет обновить все сообщения пользователя. Но тогда мне также нужно хранить атрибуты пользователя в объектах комментариев, что означает, что обновление профиля пользователя по существу требует, чтобы я обновил все сообщения, у которых есть хотя бы один комментарий пользователя, если я не хочу хранить комментарии в отдельных коллекциях.
- Сохранять только идентификатор пользователя в почтовом объекте и запускать 2 запроса: один для получения списка сообщений, а другой - для получения списка пользователей, где идентификатор пользователя находится в списке авторов сообщений. Это требует 2 запросов и дополнительной обработки в моем коде приложения для сопоставления пользователей с сообщениями.
Я уверен, что я не первый, кто столкнулся с этой проблемой, но, к сожалению, до сих пор я не нашел лучших практик в этой теме. Мнения?