如何在IndexedDB中表示层次结构?

时间:2014-08-22 22:27:35

标签: javascript hierarchy hierarchical-data indexeddb hierarchical

我有一个复杂的,可变的分层数据结构,我将从JavaScript本地存储。根据我迄今为止的研究,看起来IndexedDB是我解决方案的最佳选择。

我的结构由类似的元素组成,每个元素都有唯一的标识符和任意数量的子元素。可以有任意数量的根元素。元素可以是指向其他现有元素的符号链接。我计划在ID上创建一个objectStore,我从那里考虑了几个选项:

1)我可以直接插入根元素。这使得分层操作(修剪,克隆,移植)和备份到服务器变得更加容易 - 实际上是微不足道的;但也使搜索更加昂贵的更深层元素更加复杂。

2)我可以将每个元素直接插入到商店中,并使用子元素ID根据需要重建层次结构。这样可以加速搜索O(log n),但重新创建关系数据库的所有分层难度。

如果有办法:  a)创建一个索引或查询,快速遍历IndexeDB中的整个数据结构 或b)在IndexedDB中创建对象的多个引用

它极大地简化了问题,除此之外,我不确定如何最好地解决这个问题。

1 个答案:

答案 0 :(得分:0)

在IndexedDB中创建索引:

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

使用id查询对象存储并在其上打开一个光标进行迭代:

        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);         
       };