Mongodb: несколько определенных коллекций или одна коллекция "store-it-all" для производительности / индексации - PullRequest
4 голосов
/ 23 марта 2012

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

comment : {"_id":(mongoId), "type":"comment", "date":4/7/2012, 
           "user":"Franck", "text":"This is a sample comment"}

search : {"_id":(mongoId), "type":"search", "date":4/6/2012, 
          "user":"Franck", "query":"mongodb"} etc...

По сути, в ООП или СУБД я бы разработал класс / таблицу действий и набор унаследованных классов / таблиц (комментарий, поиск, голосование).

Поскольку MongoDb не содержит схемы, я склонен создавать уникальную коллекцию («Действия»), в которой я буду хранить эти объекты вместо нескольких коллекций (коллекция действий + комментарии к коллекции с ключом ссылки на родительское действие и т. Д. ..).

У меня вопрос: а как насчет производительности / времени отклика, если я пытаюсь выполнить поиск по определенным столбцам?

Как я понимаю, передовые методы индексирования, если я хочу, чтобы "все пользователи искали mongodb", я бы индексировал столбцы "type" + "query". Но это не касается всего набора данных, только данных типа «поиск».

Будет ли механизм MongoDb сканировать всю таблицу или просто сосредоточиться на данных, имеющих эту конкретную схему?

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Если вы создаете разреженные индексы mongo будет игнорировать все строки, у которых нет ключа.Хотя есть определенное ограничение разреженных индексов, что они могут индексировать только одно поле .

Однако, если вы собираетесь запрос с использованием общих полей, абсолютно нетпричина не использовать одну коллекцию.

Т.е. если индекс по типу user + type (или date + user + type) удовлетворит все ваши запросы - нет причин создавать несколько коллекций

Совет: используйте объекты даты для дат, используйте идентификаторы объектов, а не имена, где это уместно.

0 голосов
/ 06 января 2015

Вот некоторая полезная информация из Best Practices MongoDB

Хранить все данные для записи в одном документе.

MongoDB обеспечивает атомарные операции на уровне документа. Когда данные поскольку запись хранится в одном документе, вся запись может быть извлекается за одну операцию поиска, что очень эффективно. В некоторых В некоторых случаях нецелесообразно хранить все данные в одном документе, или это может негативно повлиять на другие операции. Сделайте компромиссы, которые лучше всего подходят для вашего приложения.

Избегайте больших документов.

Максимальный размер документов в MongoDB составляет 16 МБ. На практике большинство документы размером в несколько килобайт или меньше. Считайте документы больше похожими строк в таблице, чем сами таблицы. Вместо того, чтобы поддерживать списки записей в одном документе, вместо этого сделайте каждую запись документ. Для больших медиа-документов, таких как видео, рассмотрите возможность использования GridFS, соглашение, реализованное всеми драйверами, которые хранят двоичные данные во многих небольших документах.

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