IndexedDB 作为 data-table 网络组件的后端
IndexedDB as a backend for a data-table web component
我正在开发一个支持排序、过滤、无限滚动等的 data-table/grid Web 组件。我正在考虑用 IndexedDB(使用 Dexie)替换我现有的数据模型。
我最初的计划是使用 一个数据库 并且每个组件都有一个 "table"。但是,在阅读了文档之后,我意识到每次添加新的 table 时,数据库的 version 都会上升。
这意味着什么?
- 我需要跟踪这个版本号吗?
- 如果一个网格正在使用数据库,另一个网格升级数据库,数据会丢失吗?
- 每个组件使用一个数据库是否更好?
感谢您的帮助
确实,indexedDB 的架构相当静态。每当您必须更改它时,它都需要关闭所有现有连接,这可能会在加载您的应用程序时中断其他选项卡。如果您的应用程序的所有实例都表现相同 - 即关闭并在 'versionchange' 事件发生时动态重新打开其数据库。这是可能的。但是,长 运行 事务将阻止它升级,直到它们完成。
我很好奇你想要完成什么。我想你想利用 indexedDB 索引进行排序和 paging/scrolling。但是不清楚你是否有一个具体的模型,或者你的组件是否将是通用的/适应任何模型/模式。
如果您的模型是具体的,并且您的组件是特定于 end-user 应用程序的。您可以使用 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.
});
相关文档:
我正在开发一个支持排序、过滤、无限滚动等的 data-table/grid Web 组件。我正在考虑用 IndexedDB(使用 Dexie)替换我现有的数据模型。
我最初的计划是使用 一个数据库 并且每个组件都有一个 "table"。但是,在阅读了文档之后,我意识到每次添加新的 table 时,数据库的 version 都会上升。
这意味着什么?
- 我需要跟踪这个版本号吗?
- 如果一个网格正在使用数据库,另一个网格升级数据库,数据会丢失吗?
- 每个组件使用一个数据库是否更好?
感谢您的帮助
确实,indexedDB 的架构相当静态。每当您必须更改它时,它都需要关闭所有现有连接,这可能会在加载您的应用程序时中断其他选项卡。如果您的应用程序的所有实例都表现相同 - 即关闭并在 'versionchange' 事件发生时动态重新打开其数据库。这是可能的。但是,长 运行 事务将阻止它升级,直到它们完成。
我很好奇你想要完成什么。我想你想利用 indexedDB 索引进行排序和 paging/scrolling。但是不清楚你是否有一个具体的模型,或者你的组件是否将是通用的/适应任何模型/模式。
如果您的模型是具体的,并且您的组件是特定于 end-user 应用程序的。您可以使用 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.
});
相关文档: