使用 indexeddb 作为具有多个版本的版本化数据库

Posted

技术标签:

【中文标题】使用 indexeddb 作为具有多个版本的版本化数据库【英文标题】:Using indexeddb as a versioned database with multiple versions 【发布时间】:2020-02-25 17:52:41 【问题描述】:

场景:

您在 2018 年创建了一个 Excel 工作表。它在工作表中具有查找表。让我们将此数据库称为 1。用户将 excel 作为表单 ID 1 提交。 现在在 2019 年,您更新了查找表并发布了新版本的 Excel。现在是 DB 版本 2。用户提交最新的 2019 excel 作为表单 -ID 2。

现在尝试在 Web 应用程序中执行此操作。我们使用 Rule.JS、Formula.JS 和 JS Promise 以及索引数据库来模仿类似 Excel 的函数。我们使用 indexeddb 来避免多次调用 db 进行查找。所以只有 STATIC 数据存储在 indexeddb 中。当使用最新数据时,所有这些都有效。我的设计挑战是为可能需要使用旧版本的数据库查找表的旧表单执行此操作。

当您在浏览器中打开 Form Id 1 时,应加载 Db ver 1。

当您在浏览器中打开 Form Id 2 时 - 应加载 Db ver 2。

问题:

    indexeddb 能否用于使用 indexedDB.open(dbname,ver) 在页面加载时加载特定版本? 可以在页面加载时降级 indexeddb 版本吗? 我们可以在页面加载时将版本号作为参数从 JS 传递吗?

问题是每个表单都需要根据提交时间拉取特定版本的 Db。使用 indexedDb,我知道它是一个前瞻性的数据库。所以我们只能升级到较新的版本,不能降级。有没有办法用 indexeddb 做到这一点,还是我在叫错树?

我想出的一个解决方案是在 SQL 中创建两个表。 1 个实际表,1 个存档表。每次更新数据时,我们都会将旧数据移动到版本号为 # 的存档表中。如果表单正在查找特定版本,则 GetData(lookupvariable, ver#) 可以搜索任一表以查找该特定版本的值。这样,我最终将不得不将所有内容都转换为 AJAX 调用并取消 indexeddb。

【问题讨论】:

【参考方案1】:

无论版本如何,名为 foo 的 IDB 数据存储都将具有相同的数据。因此,如果您在 v1 中添加数据,然后将其更改为 v2,则数据不会消失。 IDB 使用版本控制来让您更改结构。您只能在版本更改时修改对象存储。

所以我会说是的 - 你在这里叫错了树,使用版本控制作为数据分区的一种方式。我认为您的存档表解决方案实际上更有意义。

【讨论】:

Raymond- 感谢您验证我的想法。我想我会做存档方法。但是出于好奇,您认为我们可以在每次页面加载时删除 indexeddb 并使用版本分区将特定版本加载到浏览器中吗?我知道如果打开多个选项卡,这会导致它自己的地狱。但我只是想检查一下是否有可能? 为什么要在每次页面加载时删除 IDB?这不是违背了存储数据的目的吗? 我们正在为每个表单使用对索引数据库的承诺进行超过 100 次调用。那是因为我们使用 javascript/jsquery 模仿了 excel 公式。这些都是复杂的科学公式。所以这是一种限制 ajax 调用并使用客户端数据库来减少流量的方法。 是的,但这并不能回答您为什么要删除您的数据。您上面的评论解释了您为什么要使用 IDB - 它对用户来说是本地的并且更快。但是每次加载都删除数据是没有意义的。 我正在讨论在每次加载页面时删除数据库和数据的可能性,以便可以指定版本并且版本分区负责创建和填充数据。但正如我们所讨论的,这不值得。

以上是关于使用 indexeddb 作为具有多个版本的版本化数据库的主要内容,如果未能解决你的问题,请参考以下文章

indexeddb怎么触发onupgradeneeded

html5 indexedDB数据库版本更新问题

如何解决IndexedDB在webkit内核下新旧版本的兼容问题

如何解决IndexedDB在webkit内核下新旧版本的兼容问题

填充许多 ObjectStore 时的 IndexedDB,错误:无法在“IDBDatabase”上执行“事务”:版本更改事务正在运行

IndexedDB 的概念问题(关系等)