Проверяет понимание проектирования схем в MongoDB: выбор между встраиванием массива в документ и созданием отдельной коллекции для связи один-ко-многим.
В MongoDB нет жёстких правил, как в реляционных базах. Вы сами решаете, хранить ли связанные данные внутри одного документа или разнести по коллекциям. Главный критерий — как данные используются и как они изменяются.
Встраивание (embedding) подходит, когда связь один-ко-многим имеет небольшой и предсказуемый размер. Например, у пользователя есть список телефонов — обычно 1–3 номера. Такой массив удобно хранить прямо в документе пользователя. Тогда при чтении профиля вы сразу получаете все телефоны без дополнительных запросов. Это быстрее и проще для атомарных обновлений.
// Документ пользователя с встроенным массивом телефонов
{
_id: ObjectId("..."),
name: "Иван",
phones: [
{ type: "mobile", number: "+7-900-123-45-67" },
{ type: "home", number: "+7-495-123-45-67" }
]
}Встраивание также удобно, когда дочерние элементы не существуют отдельно от родителя и не нужны для запросов сами по себе. Например, позиции заказа — они всегда загружаются вместе с заказом и не запрашиваются отдельно.
Отдельная коллекция (referencing) нужна, когда количество связанных элементов может быть большим или неограниченным. Например, у пользователя могут быть тысячи заказов. Если хранить их массивом в документе пользователя, документ быстро превысит лимит в 16 МБ, а каждое добавление заказа будет перезаписывать весь документ, что медленно.
// Коллекция users
{ _id: ObjectId("..."), name: "Иван" }
// Коллекция orders
{ _id: ObjectId("..."), userId: ObjectId("..."), total: 1500, items: [...] }Также отдельная коллекция оправдана, если дочерние элементы часто обновляются независимо или нужны для выборок по своим полям. Например, комментарии к статье: их много, они добавляются постоянно, и часто нужно получить последние комментарии без загрузки всей статьи.
Выбор между массивом и отдельной коллекцией зависит от размера, частоты изменений и паттернов доступа. Встраивание даёт производительность и атомарность, но ограничено размером документа. Отдельная коллекция масштабируется лучше и удобна для независимых запросов. Начинайте с встраивания, если сомневаетесь, но переходите на отдельную коллекцию, когда данные начинают расти или требуют самостоятельных выборок.