Почему бесконечно растущие массивы это плохо?

Почему бесконечно растущие массивы в mongodb являются плахой практикой?
Если рассматривать пример из документации, то почему считается неприемлемым иметь в документе Autor массив с идентификаторами книг и предлогается документам Book ссылаться на автора? Неужели искать сотню книг, пренадлежащих одному автору, из миллиарда, производелтельней, чем выбрать сто книг по идентификаторам хранящихся в массиве? По логике куда больше вероятности что я все сто книг выбиру раньше, чем перечислю весь миллиард. Или же mongodb как-то оптимизирует этот процесс?
  • Вопрос задан
  • 1515 просмотров
Решения вопроса 3
dimonchik2013
@dimonchik2013
non progredi est regredi
а где там написано, что Монга будет
искать сотню книг, пренадлежащих одному автору, из миллиарда

?

пример вообще об уменьшении избыточности
ну а ответ там же по ссылке
Ответ написан
@Wentixon
Тут все зависит от ситуации. На счёт производительности я так понял вы уже разобрались. БД не такие тупые, чтобы все 100 лямов записей перебирать в поиске нужной. Даже в этом случае, хранение в массиве вам никак бы не помогло, так как данные все равно пришлось бы вытягивать из другой коллекции. Только в этом случае выборка получилась бы гораздо сложнее и медленнее.

Чтобы ответить на свой вопрос, подумайте, как бы вы вытянули из БД книги издательства, в которых более 100 страниц, если бы хранили в массиве? Это первый момент.

Также иногда вам не нужны будут айдишники на клиенте. Придется усложнять запрос, чтобы исключить их для оптимизации.

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

В примере рассмотрена связь one to many, когда к примеру одно издательство имеет много книг, а книга только одно издательство. Но есть связь many to many. Например, рецепт имеет много ингридентов, а каждый ингридиент привязан ко многим рецептам. В этом случае в nosql как раз нужно использовать массив.

Так что все зависит от ситуации. Иногда даже лучше не делать отдельную коллекцию, а записывать документ целиком в массиве, как в первом примере из ссылки.
Ответ написан
Бесконечно растущие массивы это плохо, потому что вы его храните в документе. При каждом увеличении массива, документ не будет умещаться в то же самое место на диске, поэтому монга перенесёт его полностью в новое место. Для этого ей понадобиться прочитать все эти миллионы элементов массива, добавить к нему один и записать. И так каждый раз. В итоге вместо записи несколько новых байт на диск монге придётся считывать мегабайты/гигабайты и записывать их на диск заново в новом месте. Это ни разу не оптимально. Я уже не говорю про то что рано или поздно документ станет настолько большим, что его невозможно будет прочитать/обновить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08
Ты не можешь гарантировать того, что твоему бесконечно растущему массиву хватит памяти. Память конечна. А раз конечна, то подумай над тем, когда она закончится и что станется с твоим массивом. Крах, беда, потоп, ребут, потеря данных, выстрел в ногу.
Ответ написан
Ваш ответ на вопрос

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

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