13

Webサイトでデータを画像表示するときに、CouchDB添付ファイルを使用すると非常に便利であることがわかりました。ただし、データベースをモバイル環境に複製する場合、ビューを実行してから、添付ファイルにアクセスするためにドキュメントを循環する必要があるのは非常に非効率的です。iOS / Androidプラットフォームでは、データを通常のBLOBとして保存し、1つのビュークエリ(最初にすべてのドキュメントデータを出力するビュークエリ)ですべてのバイナリデータにアクセスできる方がはるかに効率的です。map関数で添付ファイルDATAを読み取り、emitステートメントに含める方法はありますか?_attachmentsを介して利用できる添付ファイル情報があるようですが、これではデータにアクセスできません。

更新 添付ファイルではなくドキュメント自体でBLOBを使用することの主な欠点(受け入れられた回答では詳しく説明されていません)は、ドキュメントを更新するときに、ドキュメント全体を取得してからPOSTする必要があることです。添付ファイルを使用していない場合は、使用しない添付ファイルを使用して、すべてのバイナリデータを取得する必要があります。ドキュメントの更新を実行する場合、添付ファイルを使用することが、バイナリデータを設計するための唯一の合理的な方法です。

4

1 に答える 1

16

あなたは素晴らしい質問にぶつかりました!

アタッチメントとは何ですか?

バイナリデータですか?そうですね、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!')
})
于 2012-04-06T00:08:13.917 に答える