iOS での Safari の指定された要件では、WebSQL 以外に代替手段はありません。WebSQL は、Opera や Blackberry などの他のモバイル ブラウザーでサポートされています。IndexedDB があったとしても、WebSQL のサポートを削除することはないと思います。どういうわけか、それらは補完的です。
一方、ブラウザーのストレージ戦争では、IndexedDB が完全に勝利しました。IE と FF には IndexedDB しかありません。皮肉なことに、FF は Sqlite の上に IndexedDB を実装しています。
私が言いたいのは、IndexedDB は単なるキー値ストア以上のものです。インデックスとトランザクションがあります。これら 2 つだけで、結合、条件付き、並べ替えなど、SQL クエリのほぼすべての機能が提供されます。非同期 API のため、最初はわかりません。
IndexedDB のパフォーマンスは WebSQL より優れています。より安全です。JavaScript のユースケースではより柔軟です。最後に使いやすいです。
ケースを説明するために、私のライブラリから擬似コードを使用しますが、IndexedDB API を直接使用することもできます。
'people' ストアには、インデックス フィールド 'name' とリスト インデックス フィールド 'hobby' があります。JSONでは、
people = {
name: 'Foo Bar',
email: 'foo@bar.com'
hobby: ['camping', 'swimming']
};
「キャンプ」が趣味の「人」から名前を検索する。
var req = db.keys('people', 'hobby', IDBKeyRange.only('camping'));
req.done(function(campers) {
db.keys('people', campers, 'name').done(function(names) {
console.log(names);
});
});
このコードの興味深い点は、シリアル化が含まれていないことです。したがって、非常に高速です。
次の例は、フレンドシップ グラフ クエリを示しています。friendship
オブジェクト ストアには、リストされたインデックス付きフィールドが 1 つだけありますfriend_list
。これは、People オブジェクト ストア キーをアウト オブ ラインの主キーとして使用します。people
オブジェクトストアには多くの属性があり、その中にはlocation
フィールドがあります。クエリは、'Singapore'を知っme
ていて、そこにいる友人のリストを検索することです。other_guy
var q1 = new ydn.db.Iterator('friendship', 'friend_list', IDBKeyRange.only(me));
var q2 = new dn.db.Iterator('friendship', 'friend_list', IDBKeyRange.only(other_guy));
// if location is not indexed, a filtered value query is used.
var q3 = new ydn.db.Iterator('people', new ydn.db.Expression(['"location"', "'Singapore'", '=']));
// if location is indexed, an index query is used.
// var q3 = new ydn.db.Iterator('people', 'location', IDBKeyRange.only('Singapore'));
var current_loop = 2; // start from inner loop
var join_algo = function(keys, index_keys) {
var advancement = [];
advancement[keys.length - 1] = null;
var has_adv = false;
for (var i = 0; i < keys.length; i++) {
if (!goog.isDef(keys[i])) {
// completed iterator
if (i != 0) {
advancement[i] = false; // request to restart the iteration
advancement[i - 1] = true; // advance outer iterator
current_loop = i - 1;
} // i == 0 means we are done.
has_adv = true;
break;
}
}
if (!has_adv) {
// continue looping current
advancement[current_loop] = true;
}
return advancement;
}
var result = db.scan([q3, q1, q2], join_algo);
result.done(function(keys, index_keys, values) {
console.log(values); // should get desire list of friends
});
繰り返しますが、この結合クエリは単なるキー スキャンであるため、非常に高速です。デフォルトでscan
は、並べ替えマージ アルゴリズムを使用して一致するキーを見つけますが、ここでは単純なネスト ループ結合アルゴリズムを示します。したがって、テーブルの結合は可能ですが、結合アルゴリズムをコーディングする必要があります。しかし、ジグザグ マージのような新しいアルゴリズムは、すべての入力が並べ替えられ、カーソルも同様に進むことができ、さらに重要なことに、結合プロセスがデータベースにない外部の知識を利用できるため、Sqlite で可能なよりも高速です。SQL では、結合操作は不透明です。
それ以外にも、IndexedDB はストリーミングやマップ/リデュース処理などの手法を使用できます。