Skip to content
A poor mans BigTable on top of SQL for Node.js.
CoffeeScript Shell
Latest commit 58ca159 Jul 16, 2012 @koenbok Fixed packaging bug
Failed to load latest commit information.
examples/http-rest Renamed to Cavia Jul 14, 2012
lib Rebuild Jul 14, 2012
src Renamed to Cavia Jul 14, 2012
test Added connection pooling Jun 7, 2012
.gitignore Initial Apr 6, 2012
Makefile Added connection pooling Jun 7, 2012
README.md Fixed read me error Jul 14, 2012
package.json Fixed packaging bug Jul 16, 2012
start.servers.sh Cleanup Jul 14, 2012

README.md

[VERY MUCH A WORK IN PROGRESS]

Simple key value implementation on top of old fashioned sql.

Philosophy

Some stuff I like for storing my data

  • A very simple engine with a minimal api (get, put, del, query) so it can be replaced with something more optimized if needed
  • Old fashion storage engines that you can hire as a service and install locally
  • options (sqlite, mysql, postgresql)
  • Data model flexibility, no schemas
  • Enforce querying on indexes, so they are always fast
  • Separating indexes from the actual data, and dynamically generating them on put
  • The ability to cheat on all of the above if you need it
  • Transactions and aggregates

Obvious downsides

  • No type checking, validation etc.
  • Not very space efficient (index is data copy)
  • Definitely not the fastest way to store data

Simple Example

models = 
    person: 
        kind: "person"
        indexes:
            age: {type: "int", getter: (data) -> data.age}

data =
    key: utils.uuid()
    kind: "person"
    name: "Koen Bok"
    age: 29

backend = new PostgresBackend "postgres://localhost/test"
store = new Store backend, [models.person]

store.create (err) ->

    # Store a person (upsert)
    store.put data, (err) ->

        # Get a person by key
        store.get "person", data.key (err, result) ->
            console.log result

        # Query persons older then 10 years
        store.query "person", {"name >": "10"}, (err, result) ->
            console.log result

Api

new Backend <"dsl">, <[models]>

store.create <"kind">, callback
store.get <"kind">, <"key", [keys]>, callback
store.put <"kind">, <{data}, [{data}]>, callback
store.del <"kind">, <"key", [keys]>, callback
store.query <"kind">, <{filters}>, callback

Run the tests

make test

Extras

REST API example using express. Deployable to Heroku.

Todo

  • Make it work in the browser with websql database
  • Add middleware system and implementations (caching, serializing, performance, logging, structured data validation, authentication)
  • Add events action.pre|post
  • Refactor transactions to be objects
  • Refactor query pattern to something nicer (allowing querying on multiple indexes)

Inspiration

http://backchannel.org/blog/friendfeed-schemaless-mysql

Something went wrong with that request. Please try again.