2

単一ページのアプリケーションで作業していると、サーバー側のデータと同期するために、多くのボイラープレート コードを書かなければなりません。

PouchDBは、この問題に対する洗練されたソリューションを提供し、クライアント側でローカルにデータにアクセスできるようにします。

私が理解していないのは、データベースが大きすぎてブラウザのメモリに完全に収まらない場合に、Pouch がデータベース プロキシとして適しているかどうかです。

私が読むことができる限り、Pouch はリモート データベース全体を複製して動作するため、データベース全体がブラウザのメモリに収まる場合にのみ使用できます。

ユースケースの例

ウィキペディアのすべての記事を含むデータベースがあり、クライアント側でそれらの一部を操作したいとしましょう。レプリケーションは進むべき道ではありません。必要なのはプロキシです。たとえば、クエリがクライアント側でローカルに発行された場合、一致する結果のみが転送されます。データベース全体をローカルに複製することはできないため、複製された値に対してのみクエリを実行することはできません。

4

1 に答える 1

5

おっしゃる通り、PouchDB の同期は本当にやりたいことを実行しません。サーバー側の設計ドキュメントを使用して、データベース全体、またはデータベースの事前定義されたサブセットを同期するように設計されています。

私があなただったら、おそらくまだ PouchDB を使用するでしょうが、同期は手動で処理します。このようなもの:

var localDB = new PouchDB('localDB');
var remoteDB = new PouchDB('http://some-site.com:5984/somedb');

function searchForDocs(docId) {
  // try the local DB first
  localDB.get(docId).catch(function (err) {
    if (err.name !== 'not_found') {
      throw error;
    }
    // not found, so fall back to the remote DB
    return remoteDB.get(docId).then(function (doc) {
      // cache in the local DB
      delete doc._rev;
      return localDB.put(doc).then(function () {
        return doc;
      });
    });
  }).then(function (doc) {
    // do something with our doc
  }).catch(function (err) {
    // handle any errors along the way
  });
}

ここでの使用get()は少し単純化されています。allDocs({startkey: query, endkey: query + '\uffff'})ウィキペディアの場合、ID がクエリで始まるすべてのドキュメントを検索する必要があるでしょう。または、セカンダリ インデックスを使用することもできます。

したがって、PouchDB のビルトイン同期の利点は得られませんが、クライアントと同じコードをサーバーに対して記述できるという利点と、PouchDB のクロスブラウザー サポートの利点が得られます。ですから、このやり方が悪いとは思いません。

于 2014-08-01T02:24:41.073 に答える