2012-02-07 2 views
3

Каков наилучший способ хранения подобных структур в MongoDB? Выберите одну коллекцию для всех или одну для каждой структуры? Любые преимущества наличия одного/нескольких?Выбор структуры коллекций 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 поля будут проиндексированы (и, конечно, конечно). И ограниченное количество таких предметов, например, всего 3 типа предметов. Будет много записей и небольшое количество сообщений

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

ответ

3

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

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

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

веселит,

Дерик

Смежные вопросы