2016-02-20 17 views
0

所以我正在阅读很多关于如何以有效的方式实际存储和获取数据的内容。基本上我的应用程序是关于项目的时间管理/捕获。对于我应该使用哪种策略的任何意见,甚至对其他策略的建议,我感到非常高兴。主要关心的是关于不同浏览器上本地存储的有限资源。使用PouchDB/CouchDB进行高效DB设计

这是我必须存储主数据:

db_projects:这是项目本身存储的数据库。

db_timestamps:当项目运行时,请为每个项目添加时间戳。


我想出了以下策略:

1:存储在时间戳

当一个项目开工的项目的状态,有addad时间戳像db_timestamps所以:

db_timestamps.put({ 
    _id: String(Date.now()), 
    title: projectID, 
    status: status //could be: 1=active/2=inactive/3=paused 
})... 

这跟着策略到only add data到db并且不修改任何对象里斯。我在这里看到的问题是,如果我想要例如获取所有活动项目,则需要查询可包含数千个条目的整个db_timestamp。由于我无法使用ID来搜索所有活动的项目,这可能会导致数据库查询相当繁重。

2:每次一个项目改变它的状态存储项目的地位db_projects

,有更新项目本身。因此,“获得所有活动项目” - 查询将非常资源友好,因为项目比时间戳少得多。但是这也意味着每次状态变化发生时,项目条目都会被修改,因此会产生很多开销。我也不确定compaction feature是否会做得很好,因为并非所有的修订版本数据都被删除(文档是,但是没有修订版本)。这意味着对于一个状态变化,我们至少有_rev信息,它仍然是一个34字符的字符串,用于只更改状态(1个字符)。或者我可以在冲突解决后删除叶修订版吗?

3:存储在单独的数据库状态像db_status

这导致了相同的问题#2,因为状态变化导致在这个数据库的修改。或者,如果将状态添加到“仅添加数据”模式(如#1中),它将快速填充条目。

回答

0

一般问题是,您可以将有限的空间放入indexedDB中。另一方面,ChouchDB的原理是存储空间很便宜(当你只在服务器端存储时,这确实是真的)。 Here an interesting discussion about that.

所以这是我现在使用的解决方案。我使用溶液1和溶液2之间的混合从上方有以下补充:

  1. 仅存储在一个同步数据库(db_timestamps)与“仅添加数据”的原则timesamps。
  2. 将项目及其状态存储在单独的本地(不是 同步)数据库(db_projects)中。因此,我仍然使用pouchDB,因为它有比索引DB更简单的API,因为它有 。在每个时间戳藏汉
  3. 存储新的/改变 项目状态(所以你可以重建db_projects 出如果需要db_timestams的)
  4. 删除db_projects每隔一段时间,并重新填充它,所以 修订数据(开销为这个分贝在我的情况)被淘汰,大小是可以接受的。

我用下面的代码来重建我的DB:

//-------------------------------------------------------------------- 
function rebuild_db_project(){ 
    db_project.allDocs({ 
     include_docs: true, 
     //attachments: true 
    }).then(function (result) { 
     // do stuff 
     console.log('I have read the DB and delete it now...'); 
     deleteDB('db_project', '_pouch_DB_Projekte'); 
     return result; 
    }).then(function (result) { 
     console.log('Creating the new DB...'+result); 
     db_project = new PouchDB('DB_Projekte'); 

     var dbContentArray = []; 
     for (var row in result.rows) { 
      delete result.rows[row].doc._rev; //delete the revision of the doc. else it would raise an error on the bulkDocs() operation 
      dbContentArray.push(result.rows[row].doc); 
     } 
     return db_project.bulkDocs(dbContentArray);  
    }).then(function(response){ 
     console.log('I have successfully populated the DB with: '+JSON.stringify(response)); 
    }).catch(function (err) { 
     console.log(err); 
    }); 
} 

//-------------------------------------------------------------------- 
function deleteDB(PouchDB_Name, IndexedDB_Name){ 
    console.log('DELETE'); 

    new PouchDB(PouchDB_Name).destroy().then(function() { 
     // database destroyed 
     console.log("pouchDB destroyed."); 
    }).catch(function (err) { 
     // error occurred 
    }); 

    var DBDeleteRequest = window.indexedDB.deleteDatabase(IndexedDB_Name); 
    DBDeleteRequest.onerror = function(event) { 
     console.log("Error deleting database."); 
    }; 
    DBDeleteRequest.onsuccess = function(event) { 
     console.log("IndexedDB deleted successfully"); 
     console.log(request.result); // should be null 
    }; 
} 

所以我不仅用pouchDB.destroy()命令也是indexedDB.deleteDatabase()命令来获取存储近释放完全(仍然有一些4kB没有被释放,但这对我来说是微不足道的。)

时间并不是真的适合,但它适用于我。如果somone有一个想法来使计时工作正常(我的问题是indexedDB不支持承诺),我很高兴。