2013-08-01 3 views
0

Скажем, у меня есть приложение, которое получает запросы с двумя параметрами: X и Y. Все, что я хочу сделать, это подсчет этих запросов, и я хочу использовать MongoDB для задачи.Моделирование данных MongoDB: Дилемма вложения документов

я могу думать о двух способов хранить эту информацию в MongoDB:

1. Наличие документа для каждой комбинации X и Y:

{ 
    _id : "X+Y", 
    count : 34 
} 

2. вложения Y в X, это означает, что каждый из X имеет документ, в котором обобщаются все запросы с тем, что Х:

{ 
    _id : "X", 
    total_count : 47, 
    y: { 
     "Y1" : 34, 
     "Y2" : 13 
    } 
} 

Каковы плюсы и минусы каждого из т hese методы?
Является ли один метод лучшей практикой? Есть ли другой законный метод, который мне не хватает? Это обычная дилемма?

Я читал руководство MongoDB data modeling раздел и a FAQ discussing this issue, но я не был удовлетворен.

Благодаря

Update

Мое приложение, как ожидается, обрабатывать около 50М запросов в день, в то время как каждый запрос имеет несколько атрибутов (например, X и Y), но относительно небольшое их количество (4-5), и каждый запрос должен быть подсчитан (либо вставкой, либо обновлением).
Эти данные будут запрашиваться каждый час или около того, и ожидается, что запросы будут использовать агрегацию. Эти запросы обычно запрашивают данные за последние несколько дней (до недели).

ответ

0

Если вы считаете, что может возникнуть какой-либо шанс, вам нужно получить общее количество, сгруппированное по X, а затем придерживаться второго метода. Кроме того, если есть вероятность, что вам может понадобиться его сгруппировать по Y, это не плохая практика для денормализации ваших данных и хранения Xs, встроенных в Ys, а также Xs, встроенных в Ys. Это потому, что плохая производительность mongo с агрегацией.

Если вы уверены, что вам не понадобится какой-либо агрегации, 1-й метод был бы лучше с точки зрения более быстрого чтения/записи и использования дискового пространства.

Или, если вы не совсем уверены, храните его вот так: {x: "X", y: "Y", count: 42}. Убедитесь, что вы создали для этого индекс {x: 1, y: 1}. Таким образом, вы по-прежнему сохраняете возможность извлекать все документы с помощью «X» или «Y». Обратите внимание, что наличие индекса {x: 1, y: 1} означает, что вам не нужно создавать индекс {x: 1} для запроса по «X», только {y: 1} для запроса по «Y».

+0

Первый способ был бы лучше с точки зрения чтения/записи ?! Может быть, если я запрошу конкретные X и Y, правильно? Поскольку, если я запрашиваю несколько типов, я должен запрашивать несколько документов (больше, чем во втором методе), и, насколько я понимаю, чем больше документов вы запрашиваете, тем хуже получается, нет? –

0

Имея абстрактные документы, подобные этому, трудно дать совет, но, пожалуйста, избегайте использования не описательных клавиш (или значений как ключей). Обновите свои вопросы с помощью реального примера вашего документа и какие запросы (вставьте, обновите и найдите), которые, по вашему мнению, вам понадобятся. Это единственный критерий, который можно использовать для разработки правильной схемы.

+0

Я обновил вопрос, хотя по-прежнему считаю, что эти методы могут быть описаны с плюсами и минусами независимо от примера реального мира. –