我正在开发一个支持排序、过滤、无限滚动等的数据表/网格 Web 组件。我正在考虑用 IndexedDB(使用 Dexie)替换我现有的数据模型。
我最初的计划是使用单个数据库并为每个组件创建一个“表”。但是,在阅读文档后,我意识到每次添加新表时,数据库的版本都会上升。
这意味着什么?
- 我需要跟踪这个版本号吗?
- 如果一个网格正在使用数据库,另一个网格升级数据库,数据会丢失吗?
- 每个组件使用一个数据库会更好吗?
谢谢你的帮助
确实 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.
});
相关文档: