大型Electron应用本地数据库技术选型
https://www.cnblogs.com/liulun/p/13061672.html?ivk_sa=1024320u
开发一个大型Electron的应用,或许需要在客户端存储大量的数据,比如聊天应用或邮件客户端
可选的客户端数据库方案看似很多,但一一对比下来,最优解只有一个
接下来我们就一起来经历一下这个技术选型的过程:
排除:把数据以Json的形式存储在文件中
以这种方式存储一些用户的配置信息是完全没问题的(用户名、家庭住址、是否开启免打扰模式等)
但要用这种方式存储大量解构化的数据,就非常不科学了
主要原因是:
用这种方案操作数据是需要把文件中的所有数据都加载到客户端电脑的内存中去的
由于没有索引机制,关联查询、条件查询等操作效率不高,
更新了某项数据之后,要持久化更新操作,又要重写整个文件。
PS:
如果你的应用操作的数据量不多,
你可以选择类似lowdb(https://github.com/typicode/lowdb)这样的工具,
在一定程度上环节这些困难
排除:LocalStorage、SessionStorage、WebSql、Cookies
Cookies存储容量太小,只能存4kb的内容,而且每次与服务端交互,同域下的Cookie还会被携带到服务端,也没有关联查询、条件查询的机制
LocalStorage存储容量也很小,大概不会超过10M,它是以键值对形式保存数据的,同样也没有关联查询、条件查询的机制
SessionStorage最大的问题是,每次关闭应用程序,它里面的内容会被清空,想持久化存储数据,就不用考虑它了
WebSql诸般特性都挺好,无奈这个技术已经被W3C委员会否决了,不知道哪天Electron也不支持了,到时就傻眼了
分析
现在可选的成熟方案几乎只剩下SQLite和IndexedDB了,
SQLite是一个轻型的、嵌入式的SQL 数据库引擎,其特点是自给自足的、无服务器、零配置的、支持事务。它是在世界上最广泛部署的 SQL 数据库引擎。
IndexedDB是Chromium内置的一个基于JavaScript的面向对象的数据库,在Electron应用内它存储的容量限制与用户的磁盘容量有关,是用户磁盘大小的1/3
市面上选这两个方案的商业产品各都有很多
那么到底哪个好呢?
接下去我们就做一个性能的对比
SQLite和IndexedDB性能对比
结论分析
结论:插入数据两个数据库性能相差巨大,IndexedDB显然优于SQLite,检索,删除,更新操作两个数据库性能相差无几
分析:
SQLite有双写入机制,IndexedDB应该是有多级缓存写入机制(待考),显然多级缓存写入机制更优秀
因为是Electron工程下完成此对比,所以Js经Electron转到Node.js再转到SQLite的Node module最后才转到SQLite的C代码,这个过程可能是性能损耗的一大主要原因
最后:
综合对比下来,大型Electron应用更推荐使用IndexedDB来存储业务数据
(由于有Dexie的加持,IndexedDB操作也足够简单,所有中小型应用也是不错的选择)
如果你需要加密客户端数据,SQLite还需要外套sqlcipher这样的加密库,所以性能上会有更多损耗,
然而IndexedDB本身就有一层加密逻辑(可以说只能防君子,防不了小人),虽然简单,但聊胜于无。