Ответ 1
Одиночная сборка
Отредактированная версия вопроса делает реальное требование более ясным: у вас есть коллекция, которая может потенциально сильно расти и вам нужен подход к разделению данных. Лимит искусственного сбора - ваша собственная планируемая схема разбиения.
В этом случае, я думаю, вам лучше использовать одну коллекцию и воспользоваться функцией MongoDB auto-sharding для распространения данных и нагрузку на несколько серверов по мере необходимости. Несколько коллекций по-прежнему являются действительным подходом, но излишне усложняют ваш код приложения и развертывание по сравнению с использованием основных функций MongoDB. Предполагая, что вы выберите хороший ключ осколка, ваши данные будут автоматически сбалансированы по вашим осколкам.
Вы не можете сразу окунуться; вы можете отложить решение до тех пор, пока не увидите, что ваша рабочая нагрузка требует большего количества шкалы писем (но знание опции там, когда вам это нужно). У вас есть другие варианты, прежде чем принимать решение об обструкции, например, модернизировать ваши серверы (в частности, диски и память), чтобы лучше поддерживать вашу рабочую нагрузку. И наоборот, вы не хотите ждать, пока ваша система будет раздавлена рабочей нагрузкой до того, как она появится, поэтому вам обязательно нужно следить за ростом. Я бы предложил использовать бесплатную службу мониторинга MongoDB (MMS), предоставленную 10gen.
На другом веб-сайте кто-то предложил использовать многие базы данных вместо многих коллекций. Но это означает накладные расходы, а затем мне придется использовать/управлять многими различными соединениями.
Несколько баз данных значительно повысят административные издержки и, вероятно, будут чрезмерны и, возможно, вредны для вашего использования. Хранение выделяется на уровне базы данных, поэтому 120 баз данных будут потреблять гораздо больше места, чем одна база данных с 120 коллекциями.
Исправлено количество коллекций (исходный ответ)
Если вы можете планировать фиксированное количество коллекций (120 в соответствии с вашим исходным описанием вопроса), я думаю, что имеет смысл использовать этот подход, а не использовать монолитную коллекцию.
ПРИМЕЧАНИЕ. Приведенные ниже соображения по дизайну все еще применяются, но поскольку вопрос был обновлен, чтобы уточнить, что несколько коллекций являются попыткой схемы разбиения, то одинарная коллекция будет более простой.
Мотивы для использования отдельных коллекций:
-
Ваши документы для одной большой коллекции, вероятно, должны включать некоторые признаки подтипа коллекции, которые могут потребоваться добавить к нескольким индексам и могут значительно увеличить размеры индекса. С отдельными коллекциями подтип уже неявчен в пространстве имен коллекции.
-
Облицовка включена на уровне коллекции. Одна большая коллекция предоставляет только подход "все или ничего", тогда как отдельные коллекции позволяют вам контролировать, какие подмножества (-ы) данных нужно очертить и выбрать более подходящие ключи осколков.
-
Вы можете использовать
compact
для команды для дефрагментации отдельных коллекций. Примечание.compact
- это операция блокировки, поэтому обычной рекомендацией для производственной среды HA будет развертывание набора реплик и использование скользящего обслуживания (например, сначала скомпилируйте второстепенные функции, затем снимите и скомбинируйте первичная). -
В настоящее время MongoDB 2.4 (и 2.2) имеет гранулярность блокировки записи на уровне базы данных. На практике это не оказалось проблемой для подавляющего большинства случаев использования, однако несколько коллекций позволят вам легче перемещать коллекции высокой активности в отдельные базы данных, если это необходимо.
-
В дополнение к предыдущему пункту.. если у вас есть данные в отдельных сборниках, они смогут использовать преимущества будущих улучшений в блокировке на уровне коллекции (см. SERVER-1240 в отслеживателе проблем MongoDB Jira).