I'd go with SQLite itself.  High efficiency is not needed; certainly there will not be a high frequency of updates.  It is robust, reliable, and well-maintained.

On Sat, Feb 22, 2020 at 9:33 AM Amirouche Boubekki <xxxxxx@gmail.com> wrote:
Le sam. 22 févr. 2020 à 13:00, Lassi Kortela <xxxxxx@lassi.io> a écrit :
>
> We talked a bit about the backend for api.scheme.org with Arthur, and
> came to the conclusion that SRFI 176/168 would be a good implementation
> strategy.

I am glad you consider srfi 167 and 168.

> Can you recommend a simple key-value store to use as the engine?

See the last paragraph.

> - LevelDB from Google seems simple and widely available; the only
> problem is that it doesn't have transactions and we'd have to write our
> own transaction layer.

There is the facebook fork called RocksDB that is supposed to support
transactions. But I never tried it. I was intimitated by the .h file.

> - FoundationDB looks very fancy - but probably _too_ fancy. We don't
> need to have a distributed system for such a simple application.

It is not only a distributed system, it can work standalone.
I asked the maintainers whether the standalone mode was supported
or if it was only meant for dev setup. They replied that 1/3 of the simulations
we running standalone mode, that it was supported and work.

> An in-process library similar to SQLite could be the ideal choice.
> LevelDB seems like it would fit the bill, except for transactions.

There is three alternatives:

- http://sophia.systems, also at https://github.com/pmwkaa/sophia

- wiredtiger, GPLv3

- the thing I call okvslite, that is the standalone shared library extracted
from sqlite4 project and promoted as merely an extension of sqlite3,
called SQLite LSM extension.

There is two drawbacks to okvslite:

- It is not built by the default sqlite Makefile, you need something like
the following Makefile to build it:

  https://github.com/arew-scheme/arew-scheme/blob/master/patches/MakefileLSM#L1

- It support only a single writer.  I do not know what happens when
multiple threads
or process try to write at the same time.  I only used it, in single
thread context.

Here are Chez Scheme bindings:

  https://github.com/arew-scheme/arew-scheme/blob/master/src/arew/data/base/lsm.scm

The API is straightforward. Like SQLite it support multiple process
accessing the database file.

Feel free to ask more questions.