WebSqlからIndexeddbに変更したい。ただし、次のようなSQLクエリをどのように実行しますか
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@[email protected]'
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@[email protected]' and age = 30
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@[email protected]' and name = 'Bill'
etc
indexedDBを使用しますか?たとえば、indexedDbの documentation を読んでいるときに、すべての例で一度に1つのインデックスしかクエリされないことに気付きました。だからあなたはすることができます
var index = objectStore.index("ssn");
index.get("444-44-4444").onsuccess = function(event) {
alert("Name is " + event.target.result.name);
};
しかし、同時に複数のインデックスをクエリする必要があります!
複合インデックス に関する興味深い投稿もいくつか見つかりましたが、複合インデックスのすべてのフィールドをクエリした場合にのみ機能します。
あなたの例では、複合インデックスは引き続き機能しますが、2つの複合インデックスが必要です
objectStore.createIndex('ssn, email, age', ['ssn', 'email', 'age']); // corrected
objectStore.createIndex('ssn, email, name', ['ssn', 'email', 'name'])
そして、このようなクエリ
keyRange = IDBKeyRange.bound(
['444-44-4444', 'bill@[email protected]'],
['444-44-4444', 'bill@[email protected]', ''])
objectStore.index('ssn, email, age').get(keyRange)
objectStore.index('ssn, email, age').get(['444-44-4444', 'bill@[email protected]', 30])
objectStore.index('ssn, email, name').get(['444-44-4444', 'bill@[email protected]', 'Bill'])
インデックスは任意の順序で配置できますが、最も具体的なものが最初に来ると最も効率的です。
または、 キー結合 を使用することもできます。キー結合には、4つの(単一の)インデックスが必要です。 4つのインデックスは、より少ないストレージスペースとより一般的なものを使用します。たとえば、次のクエリには別の複合インデックスが必要です
SELECT * FROM customers WHERE ssn = '444-44-4444' and name = 'Bill' and age = 30
キー結合は、そのクエリでも引き続き機能します。