philippgille / gokv

Simple key-value store abstraction and implementations for Go (Redis, Consul, etcd, bbolt, BadgerDB, LevelDB, Memcached, DynamoDB, S3, PostgreSQL, MongoDB, CockroachDB and many more)
Mozilla Public License 2.0
749 stars 70 forks source link

Queries #73

Open ghost opened 5 years ago

ghost commented 5 years ago

Graphql means you don't need a query language because graphql is an agnostic one.

Just write non join queries in each graphql resolver. Good match for KV stores !

Seems like a perfect match for this project.

It maybe that these basic queries can be done agnostically in the resolvers too at runtime using reflection. Storm led the way there. I don't think it's that huge a task if things are restricted like storm does.

If a developer does not want the performance penalty of reflection based query builders they don't have to use it. In graphql the resolvers are very simple so there are no side effects either of this developer choice

https://github.com/asdine/storm

Insummary the two together gets us an agnostic query layer

philippgille commented 5 years ago

Storm looks interesting, I seem to have given it a star on GitHub a while ago, but totally forgot about that project.

I'm not sure if I understand you correctly though. Do you mean:

GwynethLlewelyn commented 3 years ago

I would certainly love a GetAll() query method, too! 😹

On the other hand, I see there may be a conceptual conflict here. Storm uses a minimalistic query language to achieve good performance, but currently, support is limited to BoltDB (at the moment of writing this comment; the author has ported his other tools to support additional KV stores, but there seems to be no information regarding doing the same to Storm). gokv, by contrast, supports a huge set of (interchangeable) backends, at the cost of having only 3 basic operations (plus Close()). Not having taken a close look at the code of either solution, it seems to me that, to achieve its magic, Storm is really tightly bound to BoldDB and expects it to be able to do by default everything it requires; gokv would have to develop a minimum set of primitives across all supported backends to give Storm what it needs. That might be a huge task to do!

But I understand the OP's point (his account seems to have been deleted in the meantime). For many simple cases, you can live with just the basic 3 (+ 1) primitives and the ease with which the backend can be replaced, especially for those nasty clients that insist that they really want memcached and not Redis... and a year later swear by BoldDB or Badger... and so forth; using gokv, the ease with which you can replace the backend is a really major feature — which comes at the cost of using only the least common denominator of all existing database backends.

It's just when things become a little more complicated that gokv shows how much it could benefit from even a basic, very rudimentary query language. Consider the following scenario: you want to check if one element of a struct has been stored under at least one key, but possibly more than one. The only 'simple' way to do it with gokv, IMHO, is to have several open store clients, one for each element of that struct (i. e. for all purposes these would be 'indices'), and create a further layer of complexity on top of gokv to keep all those indices correctly updated. I foresee that such an arrangement would require either duplicating the same content stored in the struct on each of the 'index stores'; or keep the actual data on a separate store and just store a pointer to it... well, in essence, designing your own database engine on top of gokv!

Nothing wrong with the latter approach, of course... it's just that it seems overkill for most projects — you could just easily pick a RDBMS instead (such as SQLite3...) and let it do its job...