HTML5 インデックス付きデータベースで 2 つのテーブルを結合したいと考えています。レコードを追加、更新、削除、およびリストするロット サンプルが見つかりましたが、複数のテーブルを結合するサンプルが見つかりません。
- サンプル URL: * http://users.telenet.be/kristofdegrave/ *
これらのテクノロジーを一般的に見ているだけでも、同じ疑問を抱いていました。特定の例を確認しませんでしたが、必要な場合に結合を行う方法に関する Mozilla の例を次に示します。
https://hacks.mozilla.org/2010/06/comparing-indexeddb-and-webdatabase/
SQLに比べるとかなりのコード量ですが、後からJavaScriptで抽象化するのはかなり楽だという考え方だと思います。
結合はありませんが、複数のオブジェクト ストアを開き、カーソルの反復中に結合できます。
私自身のydn-dbSELECT * FROM Supplier, Part WHERE Supplier.CITY = Part.CITY
ライブラリを使用して、次の方法でクエリを実行できます
var iter_supplier = new ydn.db.IndexValueIterator('Supplier', 'CITY');
var iter_part = new ydn.db.IndexValueIterator('Part', 'CITY');
var req = db.scan(function(keys, values) {
var SID = keys[0];
var PID = keys[1];
console.log(SID, PID);
if (!SID || !PID) {
return []; // done
}
var cmp = ydn.db.cmp(SID, PID); // compare keys
if (cmp == 0) {
console.log(values[0], values[1]);
return [true, true]; // advance both
} else if (cmp == 1) {
return [undefined, SID]; // jump PID cursor to match SID
} else {
return [PID, undefined]; // jump SID cursor to match PID
}
}, [iter_supplier, iter_part]);
詳細については、結合クエリの記事を参照してください。
結合を試行する代わりに、データの格納方法を再設計して、結合が不要になるようにします。no-sql アプローチを使用している場合、SQL と同じ正規化制約に従う必要はありません。No-sql は、適切な場合に冗長なデータの格納をサポートします。
私の知る限り、IndexedDBにはまだJOINを実行するためのAPIがありません。私が採用したソリューションには、カーソルを開き、結果をループして手動で結合することが含まれていました。これは恐ろしいRBARアプローチですが、これ以上の解決策は見つかりませんでした。
実際、IndexedDB はオブジェクト ストアであり、通常、オブジェクト ストアでは、ネストされた構造を保存するだけで済むため、結合の必要性はほとんどありません。
あなたが示した場合、コードテーブルからのデータは実際のデータと結合されます。結合なしでこれを解決するには、コード テーブルをメモリにフェッチし (通常、このデータは変更されません)、コードで結合します。