Выбор структуры коллекций MongoDB для похожих структур данных - PullRequest
3 голосов
/ 07 февраля 2012

Как лучше хранить подобные структуры в MongoDB? Выбрать одну коллекцию для всех или одну для каждой структуры? Есть ли у кого-то преимущества от одного / нескольких?

Например, мне нужно хранить несколько журналов для дальнейшей аналитики. Существует общая часть для каждой структуры и некоторые данные, специфичные для определенного типа статистики, например:

{ 
  timestamp: ...,
  client: { ... },
  type: 'stats_for_item1',
  data: { 
     id: ObjectId('xxx'),
     field1: 1,
     field2: 2 
  } 
},
{ 
  timestamp: ...,
  client: { ... },
  type: 'stats_for_item2',
  data: { 
     id: ObjectId('zzz'),
     field3: 3,
     field4: {
        field5: [5, 1]
     }
  } 
}

Как видите, у нас есть общая часть и поле data с несколькими различными полями для item1 и item2.

Похоже, что будут индексированы только поля timestamp и type (и, конечно, _id). И количество таких предметов ограничено, скажем, 3 типа. Будет много записей и небольшое количество операций чтения

Итак, мой вопрос, как организовать такие структуры? Использовать одну большую коллекцию stats и хранить там все? не создавать несколько коллекций stats_item1, stats_item2 и stats_item3. Что оптимально? Какие-нибудь преимущества? С точки зрения монго, для шардинга / индексации / запроса / блокировки / и т. Д.?

1 Ответ

3 голосов
/ 07 февраля 2012

Я бы, наверное, сохранил одну коллекцию. В случае, если вы позже получите другой тип статистики, вам не нужно повторно разрабатывать свой код для новой коллекции, которую вы затем должны будете добавить. Вы можете осуществлять поиск по элементам, для которых у вас есть определенный тип, создав индекс «type», но вы также можете искать по всем элементам, поскольку все они находятся в коллекции с индексом по метке времени. , (Обратите внимание, что MongoDB также добавляет поле _id к каждому документу и к этому тоже добавляет индекс).

Для шардинга вам нужно будет выбрать ключ для каждой коллекции. Я не знаю, каковы ваши отношения записи / чтения и как вы собираетесь читать данные, но я подозреваю, что вы ведете какую-то регистрацию с некоторым анализом позже. В этом случае, возможно, наиболее целесообразно использовать ключ шарда на «клиенте». временная метка, вероятно, будет плохим выбором, поскольку она заставит все записи в один осколок.

Разница между одной или тремя коллекциями для блокировки не имеет большого значения, так как сейчас mongoDB не выполняет блокировку для каждой коллекции (только для экземпляра сервера с блокировкой 2.0 и для каждой БД с блокировкой в готовящемся 2.2).

ура

Дерик

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...