Mongodb: несколько коллекций или одна большая коллекция с индексом
Мне нужна помощь в моделировании моих данных в монго. Большинство моих опытов было в реляционных БД, я только начинаю w/mongo. Я моделирую данные для разных событий.
- Каждое "событие" имеет одинаковые поля.
- Каждое "событие" будет содержать от сотен до миллионов документов/строк
- События динамичны, т.е. При необходимости создаются новые. т.е., возможно, создать новое мероприятие "Летние Олимпийские игры 2016".
Вероятно, самое главное, при работе с событиями (CRUD-операции) пользователям нужно будет указать имя события.
Я вижу пару способов сделать это до сих пор, и я не хочу делать серьезную ошибку при настройке моей модели данных на "неправильный" способ.
1) Коллекция "событий", в которой есть данные для всех событий. Указатель на имя "event". Запрос будет выглядеть примерно так:
db.events.find({event: 'Summer Olympics 2012');
{event: 'Summer Olympics 2012', attributes: [{name: 'joe smith', .... }
{event: 'Summer Olympics 2012', attributes: [{name: 'jane doe', .... }
{event: 'Summer Olympics 2012', attributes: [{name: 'john avery', .... }
{event: 'Summer Olympics 2012', attributes: [{name: 'ted williams', .... }
db.events.find({event: 'Summer Olympics 2013'})
{event: 'Summer Olympics 2013', attributes: [{name: 'steve smith', .... }
{event: 'Summer Olympics 2013', attributes: [{name: 'amy jones', .... }
2) Коллекция для каждого нового события, которое идет вместе, с коллекцией для отслеживания всех имен событий. Индекс имени события не требуется, поскольку каждое событие хранится в другой коллекции.
// multiple collections, create new as needed
db.summer2012.find() // get summer 2012 docs
db.summer2016.find() // get summer 2016 docs
//'events' collection
db.events.find() // get all events that I would have collections for
{name: 'summer2012', title: 'Summer Olympics 2012'};
{name: 'summer2016', title: 'Summer Olympics 2016'};
Для # 1 я немного обеспокоен тем, что как только я достиг 100 событий, каждый из которых имеет миллионы записей, поиск в "событии" будет медленным, даже если в одном из событий есть только 500 документов.
Для № 2 я "обкрадываю" модель монго здесь, создавая новую коллекцию каждый раз, и происходит событие?
Любые комментарии/идеи приветствуются, поскольку я действительно не знаю, какой из них будет в конечном итоге работать лучше, или если тот или другой заставит меня больше беспокоиться по дороге. Я огляделся (с сайтом mongo), и я действительно не могу найти конкретного ответа.
Ответы
Ответ 1
Из mongo docs здесь: моделирование данных
В некоторых ситуациях вы можете хранить информацию в несколько коллекций, а не в одной коллекции.
Рассмотрим примеры журналов коллекции, в которых хранятся документы журнала для различные среды и приложения. Коллекция журналов содержит документы следующего вида:
{log: "dev", ts:..., info:...} {log: "debug", ts:..., info:...}
Если общее количество документов невелико, вы можете группировать документы в коллекция по типу. Для журналов рассмотрим возможность сохранения отдельного журнала коллекций, таких как logs.dev и logs.debug. Коллекция logs.dev будет содержать только документы, связанные с средой dev.
Как правило, наличие большого количества коллекций не имеет значительных и дает очень хорошую производительность. отчетливый коллекции очень важны для пакетной обработки с высокой пропускной способностью.
Также говорил w/10gen парень. Для действительно больших коллекций он перечислил несколько преимуществ для разделения на более мелкие более конкретные коллекции. Его комментарий к использованию одной коллекции для всех данных и использования индекса:
Просто потому, что вы можете что-то сделать, это не значит, что вам нужно. Модель ваши данные соответствующим образом. может быть легко хранить в одной большой коллекции и индекс, но это не всегда лучший подход.