Неизбежно ли дублирование данных здесь?

#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. Если у вас нет индекса для этих двух полей, все равно придется пропускать всю коллекцию (с индексом это может быть довольно эффективно). Смотрите мой комментарий к вашему ответу о том, как вы могли бы разделить комментарии на отдельную коллекцию.