IndexedDB作为数据表Web组件的后端

时间:2017-02-15 08:20:31

标签: indexeddb dexie

我正在研究支持排序,过滤,无限滚动等的数据表/网格Web组件。我正在考虑用IndexedDB替换现有的数据模型(使用Dexie)。

我的初步计划是使用单个数据库,并为每个组件设置"表" 。但是,在阅读完文档之后,我意识到每次添加新表时,数据库的版本都会上升。

这意味着什么?

  • 我是否需要跟踪此版本号?
  • 如果网格正在使用数据库而另一个网格升级数据库,那么数据会丢失吗?
  • 是否更好地使用每个组件的数据库?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

indexedDB的架构确实是静态的。每当您必须更改它时,它将需要关闭所有现有的连接,这些连接可能会在您的应用加载时中断其他选项卡。如果您的应用程序的所有实例都行为相同 - 即关闭并在发生'versionchange'事件时动态重新打开其数据库。这是可能的。但是,长时间运行的事务会阻止它升级,直到完成为止。

我很想知道你想要完成什么。我想你想利用indexedDB索引进行排序和分页/滚动。但目前尚不清楚你是否有一个具体的模型,或者你的组件是否通用/适应任何模型/模式。

如果您的模型具体,并且您的组件特定于最终用户应用程序。您可以使用Dexie(db.version(1).stores(...))静态建模。但是当你提出这个问题时,我想你想创建一个通用组件,问题是你是否真的应该在你的组件中定义一个模式,或者让它的用户定义它并让你的组件适应现有的数据库。例如,组件的用户可能希望定义数据库并将组件用作数据查看器。您的组件可以采用输入参数:

(databaseName, tableName, columns)

然后,您可以在不指定架构的情况下实例化Dexie,而只需打开现有数据库:

var db = new Dexie(databaseName);
// Don't specify version() - open dynamically!
db.open().then(db => {
    var table = db.table(tableName);
    var indexedColumns = table.schema.indexes.map(idx => idx.keyPath);
    if (table.schema.primKey.keyPath)
        indexedColumns.unshift(table.schema.primKey.keyPath);
    }
    // Here you can render your columns.
    // For each column that also exists in indexedColumns, you can
    // orderBy() or put queries based on it.
});

相关文档: