Структурирование базы данных объекта mongoDB
Я не уверен, как построить эту базу данных в mongoDB.
Из-за моего опыта работы с реляционными базами данных я бы подумал, что база данных будет иметь такую структуру:
2 коллекции:
- пользователей
- основные реквизиты в том числе
_id
- основные реквизиты в том числе
- Рецепты
- соответствующая информация, такая как название, ингредиенты и т. д.
- ссылка на документ пользователя
Если я просто брошу _id
от пользователя (или использовать правильный DBRef) в uploaded_by
В поле для рецепта очень сложно делать операции, похожие на соединение. В частности, мне нужно получить имя пользователя для всех рецептов. Я бы возвращал массив объектов в этом формате:
{title:'chocolate chip cookies',
desc:'yummy soft cookies',
uploaded_by:'john doe'}
Чтобы сделать это, должен ли я сделать запрос для каждого рецепта, чтобы затем найти имя пользователя на основе ссылки, а затем вернуть пользовательский объект с именем пользователя и другой информацией? Это звучит слишком дорого и заставляет меня думать, что я должен просто придерживаться реляционных баз данных. Есть ли более эффективный способ сделать это?
1 ответ
Крис,
Ваша идея - это то, что я предлагаю вам сделать.
Сила mongodb заключается в наличии денормализованных данных (по сравнению с нормализованными данными, где целью является минимизация избыточности). Когда вы запрашиваете данные для Монго, вы хотите запросить базу данных только один раз и получить обратно все, что вам нужно. Нет никакого способа сделать это в mongodb, если у вас есть необходимые данные, распределенные по нескольким коллекциям (по крайней мере, нет эффективного способа, о котором я знаю). Я думаю, что вы должны рассмотреть вопрос о наличии поля "uploaded_by" в вашей коллекции рецептов, которое содержит отформатированное имя / фамилию загрузчика (как вы уже сделали вывод). Вам также понадобится поле для каждого пользователя (скажем, uploaded_recipes), которое содержит идентификатор (или коллекцию идентификаторов) для рецептов, загруженных каждым пользователем. Таким образом, вам не нужно выполнять объединения ваших данных. Это был бы "способ mongodb" для настройки вашей базы данных.
Чтобы ответить на вашу проблему с постоянством, процесс обработки изменений имени пользователя должен рассматриваться по-разному. Процедура, которая реализует изменения в пользовательском документе, также должна обновлять поле "uploaded_by" для каждого загруженного пользователем рецепта (вы переходите через поле uploaded_recipes для этого пользователя). Идея заключается в том, что вы добавляете сложность к процессу вставки, чтобы упростить и улучшить запросы к вашей базе данных.