Как представить иерархическую структуру в IndexedDB?

У меня есть сложная и переменная иерархическая структура данных, которую я буду хранить локально из JavaScript. Основываясь на моих исследованиях, кажется, что IndexedDB — мой лучший выбор для решения.

Моя структура состоит из похожих элементов, каждый из которых имеет уникальный идентификатор и произвольное количество дочерних элементов. Может быть любое количество корневых элементов. Элементы могут быть символическими ссылками на другие существующие элементы. Я планирую сделать объектное хранилище с ключом по идентификатору, оттуда я рассмотрел несколько вариантов:

1) Я могу вставить корневые элементы напрямую. Это делает иерархические операции (удаление, клонирование, пересадка) и резервное копирование на сервер намного проще — на самом деле это тривиально; но также делает поиск более глубоких элементов очень дорогим и сложным для реализации.

2) Я могу вставить каждый элемент непосредственно в хранилище и использовать идентификаторы дочерних элементов для перестройки иерархии по мере необходимости. Это ускоряет поиск до O(log n), но воссоздает все иерархические сложности реляционной БД.

Если есть способ: а) создать индекс или запрос, который быстро перебирает всю структуру данных в IndexeDB или б) создать несколько ссылок на объект в IndexedDB

это значительно упрощает проблему, кроме того, я не уверен, как лучше всего подойти к этому.


person T. Markle    schedule 22.08.2014    source источник
comment
Я знаю это более трех лет назад, но вы нашли решение? Я ищу способ хранения и поиска HTML на стороне клиента.   -  person Sam Dutton    schedule 03.10.2017


Ответы (1)


Создание индексов в IndexedDB:

        var oOptions = { keyPath : "id", autoIncrement : true };
        var oStore = dbHandle.createObjectStore( "yourstore", oOptions );
        var oIxOptions = { unique: true, multientry: false };            
        oStore.createIndex( "IxYourIndexName", "id", oIxOptions );    

Запрос хранилища объектов с использованием идентификатора и открытие курсора на нем для итерации:

        var transaction = dbHandle.transaction(["yourstore"],"readwrite");   
        var os = transaction.objectStore("yourstore");
        var cursorRequest  = null;   
        var ix = os.index("IxYourIndexName");   
        var keyRange = IDBKeyRange.only(1);// get by id = 1 
        cursorRequest = ix.openCursor(keyRange);     
        cursorRequest.onsuccess = function (ev){
           var cursor = ev.target.result;                  
        };               
        cursorRequest.onerror = function (ev) {
          console.log("  Error: " + ev.message);         
       };   
person Saurabh    schedule 15.09.2014