IndexedDB 数据库备份/恢复场景

IndexedDB Database backup/ restore scenarios

我有一个关于 indexedDBDexie.js 库的问题,用于恢复和备份数据库及其性能改进。假设我们至少有一个 2 GB 的数据库(用于离线地图数据),并且它们有一个(键,值)结构,其中键可以是字符串,值是 blob(图像或二进制矢量数据)。 因此,在我的场景中,用户 select 一个数据库,我的 Web 应用程序应该开始下载该数据库以供离线访问。那么在这种情况下,您认为哪种方法能给我最好的表现?由于我必须下载备份并恢复它们,对于 2GB 和几百万条记录,这可能是一个性能挑战。我之前为 sqlite 数据库做过类似的事情,但我只需要下载 db 文件并连接到它。在这里,我必须在下载后恢复 IndexedDB,这似乎是有问题的。所以我可以在几个子问题中解决我的问题:

首先我如何首先制作这些数据库?

然后,我该如何恢复这些备份?有什么高性能的方法吗?

关键数据类型(String或Integer)对IndexedDB的性能有影响吗?

我不确定“恢复”是什么意思,但我认为您的意思是将数据导入 IndexedDB?或者您的意思是 IndexedDB 是将其放回另一个数据库的备份和“恢复”?

我的其余回答基于“恢复”将数据导入 indexeddb 的假设。

添加数百万基于 key/value (blob) 的行时,了解系统性能的唯一方法是对其进行测试。我建议您以每行 1000 行的形式导入行,并为每个导入的块显示一个进度条。使用 bulkAdd() 或 bulkPut() 方法导入每个块。确保不要在单个事务中执行整个导入,因为这可能会使系统饿死并阻塞 indexeddb 太长时间。但是通过使用批量方法,每个块至少会使用一个事务(这也很重要 - 每 1000 条记录一个事务可能没问题 - 但如果你测试这个,请尝试不同的块大小以找到最佳速度!)。

也不知道用户在等待时间方面可以期待什么。它可以在后台执行,而用户可以在线模式使用您的应用程序吗?如果是这样,与用户必须等待导入整个数据相比,用户可能会接受更长的导入时间。

您还需要查看 StorageManager API and ask your user for permission to store large amounts of durable data. You can read page about it in dexie docs

您可能希望后台工作者获取数据并执行批量操作 - 创建一个服务工作者来完成这项工作。使用 response.blob() 并将其传递给 dexie-export-import. You could also try the ReadableStream api 以下载数据块。让工作人员执行此下载和导入将执行得更快,并且在导入时不会影响应用程序性能。

Dexie-export-import 几乎完全符合我在这里的建议 - 将行分块导入 indexeddb,但如果使用它,您需要让您的服务端点发送与 dexie 兼容的 JSON -export-import 其中 blob 是 Base64 编码的。但是由于您的数据只是键和 blob,因此您可以从拥有自己的二进制格式中受益,并在没有此插件的情况下自己执行 bulkAdd()。

关于您的最后一个问题:据我所知,使用数字或字符串作为键之间不会有太大区别。长字符串会更慢,但短字符串可能执行等于数字(如果这不是真的,请纠正我!)。你需要测试才能真正知道。

如果您要对此进行一些测试,请告诉我您的结果;)