cavia
Key-value on top of SQL
Last updated 8 years ago .
Repository · Original npm · Tarball · package.json
$ cnpm install cavia 
SYNC missed versions from official npm registry.

[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

Current Tags

  • 0.0.1                                ...           latest (8 years ago)

1 Versions

  • 0.0.1                                ...           8 years ago
Maintainers (1)
Downloads
Today 0
This Week 0
This Month 0
Last Day 0
Last Week 1
Last Month 2
Dependencies (11)
Dev Dependencies (0)
None
Dependents (1)

Copyright 2014 - 2016 © taobao.org |