Ответ 1
Вы столкнулись с большим вопросом!
Что такое вложение?
Это бинарные данные? Ну, вы можете кодировать данные Base64 и хранить их непосредственно в документе (аналогично URI данных). И вы можете, конечно, иметь текстовые или прикладные/json-приложения. Так это не так.
Это прямые загрузки? На самом деле, нет. Показать и отобразить список позволяет вам напрямую обслуживать любую часть документа (или создавать новый контент на основе данных документа).
Итак, что такое привязанность? Для меня рабочее определение вложений - это данные, которые недоступны в представлениях, отображаются и перечислены. Это оптимизация. Вы теряете доступ к нему с сервера Javascript; однако вы получаете скорость, потому что CouchDB не должен кодировать и декодировать огромное количество данных.
Иногда я также думаю об этом как о C указателях. Работа с указателями происходит очень быстро. Это небольшой, простой тип данных. Однако стоимость - это дополнительная работа по программированию, потому что они должны быть разыменованы для доступа к данным. У вас всегда есть дополнительный шаг. Такова стоимость скорости. Вложения CouchDB похожи.
Если ваши данные небольшие (возможно, значки, vcards, текст) и подходят для всего документа, идите на это! Не прикрепляйте их. Однако для больших данных, таких как большинство изображений и других файлов, вложения становятся необходимыми.
Множественные выборки
Предположим, что вы запрашиваете представление и получаете 20 строк для отображения на экране. Теперь вы должны получить 20 вложений изображений.
Программисты инстинктивно считают это нежелательным. И да, это может быть разбойник. Однако во многих случаях это прекрасный компромисс. Дональд Кнут говорит: "преждевременная оптимизация - это корень всего зла". Убивает ли он нас, чтобы сделать 21 общий выбор с локального сервера, поддерживаемый SSD?Во многих случаях достаточно всего 20 запросов. Ключ должен сделать их всех одновременно. CouchDB (и мобильная couchbase) оптимизирован для одновременных запросов. Вы обнаружите, что выборка 20 изображений занимает в основном то же самое время, что и выборка.
Получение HTTP-ресурса одновременно работает по-разному на каждом языке. В Javascript это очень просто, требуя несколько строк кода с async.js.
// Assuming fetch_image(), and images = ['alice.png', 'bob.png', etc.]
async.forEach(images, fetch_image, function(er) {
if(er) throw er
console.log('Fetched 20 images!')
})