あなたは素晴らしい質問にぶつかりました!
アタッチメントとは何ですか?
バイナリデータですか?そうですね、Base64でデータをエンコードして、ドキュメントに直接保存できます(データURIと同様)。もちろん、テキストまたはアプリケーション/jsonの添付ファイルを作成することもできます。ですから、そうではありません。
直接ダウンロードですか?あまり。表示および一覧表示機能を使用すると、ドキュメントの任意の部分を直接提供できます(または、ドキュメントデータに基づいて新しいコンテンツを作成できます)。
では、アタッチメントとは何ですか?私にとって、添付ファイルの実用的な定義は、ビュー、ショー、およびリストでアクセスできないデータです。最適化です。サーバー側のJavascriptからアクセスできなくなります。ただし、CouchDBは大量のデータをエンコードおよびデコードする必要がないため、速度が向上します。
時々私はそれをCポインタのように考えることもあります。ポインタの操作は非常に高速です。それらは小さくて単純なデータ型です。ただし、データにアクセスするには逆参照する必要があるため、追加のプログラミング作業が必要になります。常に余分なステップがあります。それがスピードの代償です。CouchDBの添付ファイルも同様です。
データが小さく(ファビコン、vcard、テキストなど)、ドキュメント全体に収まる場合は、それを選択してください。それらを添付しないでください。ただし、ほとんどの画像やその他のファイルなどの大きなデータの場合は、添付ファイルが必要になります。
複数のフェッチ
ビューにクエリを実行し、画面に表示する20行を取得するとします。ここで、20個の画像添付ファイルをフェッチする必要があります。
プログラマーは本能的にこれを望ましくないと感じます。そして、はい、それは取引を破る可能性があります。ただし、多くの場合、これは適切なトレードオフです。ドナルド・クヌースは、「時期尚早の最適化はすべての悪の根源です」と述べています。SSDに支えられたローカルサーバーから合計21回のフェッチを行うことは私たちを殺しますか?
多くの場合、20回のクエリを実行するだけで問題ありません。重要なのは、それらすべてを同時に作成することです。CouchDB(およびモバイルcouchbase)は、同時リクエスト用に最適化されています。20枚の画像を取得するには、基本的に1枚を取得するのと同じ時間がかかります。
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!')
})