Ключ к хорошему использованию IDB и других хранилищ NoSQL заключается не в том, чтобы быть захваченным идентификаторами соединений, а просто в попытках сделать каждое хранилище объектов полезным для себя. (И хорошо использовать индексы!) Помните, что именно так работают базы данных 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");
Затем создайте индекс 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);
}
Благодаря индексу 'tags' в песнях обратное тоже довольно просто. Обратите внимание, что мы используем имена тегов напрямую, а не возимся с каким-то промежуточным числовым тегом_ид.
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);
}