Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Local, file-based database for an Electron application

We are working on an application that will be offered both as a web-based and as a cross-platform desktop solution by means of Electron.

Due to customer requirements, the desktop client cannot make use of "the cloud" to store data; all data should be stored in the local machine or, even better, the user should have the option to keep the database/data file on an external HDD so that another user on the same local network can use the same data file.

We've been looking at NeDB, PouchDB, etc, but all these use either Web SQL or IndexedDB on the browser itself to store the data. NeDB can theoretically use the file system but that seems only possible for Node Webkit apps.

Another option is of course MongoDB, but it requires setting up a site on a web server. Seeing as how our users will set that up in on their own machines, that will work for one user only but would make it very hard for them to share the data (note: assume users with little technical know-how).

  • Is there a way to force NeDB to persist data in a file instead of the in-browser database?
  • Alternatively, does any one know of a file-based, compact database that plays well with electron/node?

We'd preferably like to use a NoSQL database, but options of file-based SQL databases will be considered as well.

like image 463
Sergi Papaseit Avatar asked Jun 06 '16 10:06

Sergi Papaseit


1 Answers

I have some experience with NeDB in an Electron app and I can say it will definitely work on the filesystem.

How are you initializing NeDB (or whatever your database choice is)? Also, are you initializing it in the main or renderer process? If you can share that, I think we could trace the issue to a configuration issue.

This is how you start NeDB with a persistent data-store that saves to disk.

var Datastore = require('nedb')
  , db = new Datastore({ filename: 'path/to/datafile', autoload: true });

I think MongoDB is going to be overkill for an Electron app (it's meant to be really a high performance, distributed database running in the cloud).

Another option you could consider is LevelDB (a key/value store that can persist to the filesystem) which is popular in the node community. (EDIT 4/17/17 IndexedDB uses LevelDB underneath the hood, so if you go that route, may as well just use that)

One aspect I would definitely evaluate carefully is: How difficult is this database going to be to package and distribute? How do I integrate it into my build system? Level and NeDB can be included simply via npm install and any native code compiling is handled seamlessly with node-gyp, which is as simple as it gets. However, bundling Mongo, for example, will require some work to get a working build for each different platform.

like image 187
ccnokes Avatar answered Nov 10 '22 18:11

ccnokes