#database-design #mongodb
#проектирование базы данных #mongodb
Вопрос:
в принципе, у меня есть список сообщений, и мне интересно, нужна ли мне отдельная коллекция ссылок на эти сообщения. Конечно, я хочу показать имя записи в моем сокращенном списке (и при наведении курсора мыши на содержимое тоже), но запрос имени записи и содержимого тоже загрузит все комментарии, верно? (потому что они встроены. Ожидается, что массив комментариев будет значительно больше, чем «Содержимое» публикации)
Есть ли какой-либо способ избежать получения другой коллекции, но в то же время избежать загрузки комментариев каждый раз, когда я хочу узнать название / описание записи?
> db.Posts.find()
{
"_id" : "123",
"Name": "test",
"Content": "wooops",
"comments" : [ {comment1}, {comment2}, {comment3} ]
}
Конечно, я знаю, что могу просто создать другую коллекцию для комментариев. Но, насколько я могу судить, это будет невозможно при производственном использовании, потому что я ожидаю, что каждый день будет много сообщений, а это значит, что каждое новое сообщение будет создавать новую коллекцию комментариев. Рекомендуется ли это? Согласно официальным документам, максимальный номер коллекции равен 12000. Хотя в нем говорится, что их количество можно увеличить, у меня возникает стойкое ощущение, что это не было бы хорошей идеей.
редактировать: я подсчитал, абсолютный максимум составляет 1,5 миллиона коллекций / = сообщений. Чего, конечно, недостаточно.
Любой опыт по этому вопросу был бы высоко оценен 🙂
Комментарии:
1. Я действительно не понял, почему у вас нет коллекции «1» для всех комментариев с именем: «comments». (И укажите в нем post_id, чтобы вы могли получать комментарии к сообщению.
2. @frail: Вы имеете в виду поместить все комментарии ко всем сообщениям в одну коллекцию? Мои комментарии структурированы в виде дерева, (я делаю это, как описано здесь: официальный документ Я подумал (я новичок в базах данных), что запросы к древовидной структуре будут очень медленными, поскольку это похоже на рыбалку в огромном ведре, и всякий раз, когда мне нужно найти какой-либо комментарий, mongodb накладывает расходы на все остальные комментарии, существующие в моей БД.
3. Если вам не нравится предложение @frail, вы также можете создать отдельную коллекцию комментариев, но все комментарии к одному и тому же сообщению в одном документе (та же структура, что и сейчас, просто переместите поле комментариев в другую коллекцию с тем же идентификатором сообщения).
4. @Thilo: Ну, я думаю, теперь очевидно, что мне нужно сделать. Получите вторую коллекцию, как вы предложили здесь. Я все равно спрошу список рассылки, как mongodb обрабатывает пропуск встроенных материалов конкретно.
Ответ №1:
но запрос имени записи и содержимого тоже загрузит все комментарии, верно?
Не обязательно. MongoDB позволяет загружать частичные документы (аналогично проекции в SQL, где вы ВЫБИРАЕТЕ только некоторые поля) Для этого вы добавляете второй аргумент к запросу find(), предоставляя документ, в котором перечислены элементы, подлежащие возврату:
> db.Posts.find({}, {Name:true, Content:true})
Комментарии:
1. У вас есть ссылка на официальную документацию по этой функции? Звучит идеально, но я нигде не могу найти его описания.
2. Это в руководстве. Найдите «частичное». mongodb.org/display/DOCS/Tutorial
3. Верно, но это не говорит о том, как они загружаются в память. Это все равно может загрузить все целиком, но просто вернуть частичный набор. Посмотрите здесь, например: osdir.com/ml/mongodb-user/2010-03/msg01271.html
4. Предполагается, что MongoDB способен эффективно пропускать сканирование ненужных полей, извлекая только необходимые данные. Это было основной причиной внедрения BSON. Если у вас нет индекса для этих двух полей, все равно придется пропускать всю коллекцию (с индексом это может быть довольно эффективно). Смотрите мой комментарий к вашему ответу о том, как вы могли бы разделить комментарии на отдельную коллекцию.