很好地使用 IDB 和其他 NoSQL 存储的关键是不要被连接 ID 所困扰,而只是试图让每个对象存储本身就有用。(并且很好地使用索引!)请记住,这正是 SQL-ish 数据库在后台工作的方式,但它允许您在需要时进行专门的连接,而不是在一般情况下。
批量更新更具挑战性,但这更多是针对最常见的情况(显示查找歌曲/标签)进行优化,而不是针对更罕见的事情(批量更改标签名称)进行优化
您正在查看的最基本架构是将歌曲存储为:
{ 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");
然后创建一个多条目索引:
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);
}