IDB やその他の NoSQL ストアを適切に使用するための鍵は、結合 ID にとらわれず、各オブジェクト ストアをそれ自体で役立つようにすることです。(そして、インデックスを上手に使用してください!) これは、SQL 風のデータベースが内部でどのように機能するかを覚えておいてください。
一括更新はより困難ですが、これは、よりまれなもの (タグ名の一括変更) の最適化よりも、最も一般的なケース (曲/タグの検索の表示) の最適化に関するものです。
あなたが見ている最も基本的なスキーマは、曲を次のように保存することです:
{ name: "Name of Song"
id: <song id>
tags: ["tag1", "tag2", "tag3"] }
また、タグは名前で簡単に識別できます。
{ name: "tagname"
description: "Some tag description or whatever" }
最初に曲の objectStore を作成します。
var songs = db.createObjectStore("songs", "id");
次に、multiEntry インデックスを作成します。
songs.createIndex("tags", "tags", {multiEntry: true});
次に、タグ objectStore を作成します。
var tags = db.createObjectStore("tags", "name");
本当に必要な場合は自分で結合を行うことができますが、場合によってはオン/オフのものだけです.
var trans = db.transaction(["songs", "tags"]);
var songTags = [];
trans.objectStore("songs").get("songid").onsuccess = function(e) {
var song = e.target.result;
for (var i = 0; i < song.tags.length; i++) {
trans.objectStore("tags").get(song.tags[i]).onsuccess = function(e) {
var tag = e.target.result;
songTags.push(tag);
}
}
}
trans.oncomplete = function(e) {
showSongTags(songTags);
}
曲の「タグ」インデックスのおかげで、逆もかなり簡単です。タグ名を直接使用しており、中間の数値 tag_id をいじっていないことに注意してください。
var trans = db.transaction(["songs", "tags"]);
var songs = [];
trans.objectStore("songs").index("tags").openCursor("tag1").onsuccess = function(e) {
var cursor = e.target.result;
if (!cursor) return;
cursor.continue();
songs.push(cursor.value);
}
trans.oncomplete = function(e) {
showSongs(songs);
}