用于Electron、React Native和NodeJS应用的嵌入式数据库?

6
我有一个使用React-Native实现的Javascript应用程序,可以在移动应用和电脑桌面上使用Electron框架。移动应用使用react-native-sqlite-storage本地模块来保存偏好设置和数据(5-6张表),而我在Electron应用中使用node-sqlite3
这两个移动应用和桌面应用程序共享许多功能,但由于使用不同的数据库插件,它们之间存在许多差异。此外,对于桌面应用程序,由于node-sqlite3是一种本地依赖项,我必须分别为Windows和macOS构建应用程序安装程序。这很麻烦!
因此,我需要一个数据库解决方案,它应该是:-
  • 可以嵌入应用程序中
  • 与sqlite3相比更高效和性能更好
  • 支持同步到远程数据库
  • 支持macOS,Windows和Linux
  • 加密写入数据库的数据
  • 在JS运行时(浏览器/ NodeJS / JavascriptCore)具有一致的API

以下是我遇到并且看起来很有吸引力的列表:

那么,您有什么建议,并且您如何为您的应用程序实现类似的功能?

1个回答

14

我一直在测试 PouchDB、RxDB(使用 RxJS 流进行查询的 PouchDB),Realm-JS(本地数据库,类似于 sqlite3),FireStore。NeDB 不支持远程同步。

我不会详细介绍每个数据库的性能指标,但是当查询超过 20,000 个项目时,PouchDB 在内存方面非常缓慢且消耗大量资源(使用 indexeddb / websql 适配器时尝试)。

RxDB 在这么多项目上通常要快得多,特别是当订阅查询更改时(也使用 indexeddb / websql 适配器进行尝试);此外,模式和迁移非常方便。

FireStore 是一个不错的选择,并具有非常简单的服务器和客户端组件设置,但您需要舒适地运行在 Google 平台上。如果您想要对服务器逻辑进行一些控制,则可以使用 Firebase 函数提供一定的灵活性,还可以为集合自定义 ACLs。速度很好,与 RxDB 相当。如果需要,它附带了非常好的身份验证模块。

如果你想要在客户端有更高的可扩展性(虽然这可能不是你所需要的)或者想要进行复杂的查询,我强烈推荐使用像 realm 这样的东西。你需要为每个平台编译它,就像你之前用 sqlite3 一样,但是它支持同步、离线持久化、丰富的查询和出色的性能。通过 JavaScript 解决方案(如 PouchDB、RxDB 或 FireStore)即使使用了 sqlite 后端,由于大部分计算仍将发生在你珍贵的 JS 线程中,也无法与之竞争。Realm 大多数重活都是在原生库上完成的。我已经可以对 10 万项进行类似 "abc" 的查询,并返回数百个结果,在不到 100 毫秒的时间内完成,而且没有明显的 UI 冻结或内存占用增加。还支持客户端迁移,非常好用。

总之,有多种选择: 1. 如果想要自己托管所有内容并且不需要大规模扩展客户端(可以使用筛选器同步服务器数据的子集),RxDB 是非常好的并带有一组不错的功能。 2. 如果想要非常简单的设置、优美的模块(如身份验证、服务器函数等)并且不需要客户端的大规模扩展(也可以使用筛选器同步服务器数据的子集),FireStore 很棒。

需要大量客户端数据,我的首选是 Realm。尽管技术上很酷,但我个人非常不喜欢 Realm Sync 平台的定价模式,但数据库本身是免费的,也许您可以尝试实施自定义同步。

请带着一颗谨慎的心评估我的结果,因为我遇到了一些非常具体的挑战,比如大型、非关系型集合和全文搜索,您的应用场景可能会有很大的不同。


1
我很喜欢你在这个答案中所提供的详细信息。我正在使用PouchDB和NodeJS,因此我的适配器是leveldown适配器,希望它比IndexedDB更快。我会先尝试使用PouchDBCouchDB,如果不行的话,我会转向cloud firestore。非常感谢你提供如此全面的答案,我真的很感激。 - Ashishkumar Pandey
谢谢您的回答,这对我非常有帮助。 - Lukas
非常好的答案,非常详细。您可能还想查看AceBase,这是一个新的开源NoSQL实时数据库,受Firebase启发,具有索引支持(包括全文和地理位置)和强大快速查询功能。完全使用Typescript和Javascript编写,并能够在其自己的二进制格式、NodeJS中的sql server和sqlite3以及浏览器中的IndexedDB中存储数据。还支持离线使用、与外部服务器同步、身份验证(电子邮件/密码、OAuth提供程序)、授权、模式验证等等。 - Ewout Stortenbeker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接