⚠️ this project is in development⚠️
Chronological key/value Database storing based on database-shaped git
(core) architecture
we are:
- Immutable and atomic data
- ACID transactions
- Schemaless
- Chronological
- SQL compliance - in query within document
Understand how and when changes were made. chrondb stores all history, and lets you query against any point in time.
Git structure is a powerful solution for storing "data" (files) in chronological order, chrondb uses git core as a data structure to structure the data timeline, making it possible to return to any necessary point and bringing all git functions for a database:
- diff
- notes
- restore
- branch
- checkout
- revert
- merge
- log
- blame
- archive
- hooks
- ... git high-level commands (porcelain)
The goal is to speak the same language as the database world
- database: git repository (local or remotely)
- scheme: git branch
- table: directory added on git repository
- field struct: json (document) - will be persisted in a file and indexed in lucene
- Historic change with chronological evolution - aka git commits (gpg signature support)
- Document - schemeless
- Gzip compress content - when there's need for a very fast compression, gzip is the clear winner, benchmark
- Search and Full Text Search (by lucene)
- Sorting by any field
- Flexible faceting, highlighting, joins and result grouping
- Cross-Platform Solution - Linux, *BSD, macOS and Windows
- Transactions - git merge after temp branch save
- Cluster - multi git repository (regardless of location)
- High availability
- Plugable/Expandable (possibility of integration with tools that connects in git repository, e.g. jenkins)
- Triggers by events via hooks (pre-receive, update and post-receive)
- Data replication - post-receive
- Clojure package
- ODBC/JDBC - SQL Compliance
- RESTful and/or GraphQL
- Large volume of writing, possible solution git lfs, jgit implementation;
- Install Clojure command line: https://clojure.org/guides/install_clojure
clj
In the following example, it's being imported the chrondb.api
namespace; creting a database in a local test atom and commiting two changes.
Those values are just tests, there's nothing being written to GIT yet at this moment.
user=> (require '[chrondb.api :as api])
nil
user=> (api/create-database "test")
{:test {:main {}}}
user=> (api/commit {:repository :test :branch :main :message "commit message" :key :a :value :b})
{:test {:main {"UFGBTUAIBP" ({:data {:a :b}, :message "commit message"})}}}
user=> (api/commit {:repository :test :branch :main :message "commit message" :key :a :value :b})
{:test {:main {"UFGBTUAIBP" ({:data {:a :b}, :message "commit message"}), "CNNJCMTDEK" ({:data {:a :b}, :message "commit message"})}}}
Important: If you want to check our Roadmap, check our announcement regards the project development plans. We are in Phase one.