Marten, PostgreSQL as document db for .NET
Marten, PostgreSQL as document db for .NET
Since they include the JSONB column type a while ago I was thinking about using PostgreSQL as document database. But I had no time to implement something like this myself yet. So I was happily surprised when I stumbled upon Marten a few weeks ago. Marten is a new persistence library for .NET that provide document db functionality on top of a PostgreSQL database. This was exactly what I was thinking about. It is created by Jeremy Miller the creator of SturctureMap and the Fubu stack. And tough it is still in an early stage, the supported features look already promising:
- Schema-less document persistence with ACID support123456using (var session = container.Get<IDocumentSession>()){var user = new User { FirstName = "Tim", LastName = "Cools" };session.Store(user);session.SaveChanges();}
- Linq support for querying12345using (var session = container.Get<IDocumentSession>()){var allTims = session.Query().Where(user => user.FirstName == "Tim");}
- Unit of work with Identity Map and optional dirty checks
- Optimized batch udpates
- Compatibility with RavenDB client API (or close to)
- EventStore on top of PostgreSQL with sycn and async projections
What is a Marten
A Marten is a cute animal living in many parts of the world. Check it out yourself:
Why PostgreSQL
Since PostgreSQL version 9.2 they started to include more and more features to support a JSON column type. This allow you to store and retrieve schema-less documents in the database. And since 9.4 they included a binary JSON (jsonb) column type that support indexing on fields in the json data. Besides that PostgreSQL also support all traditional database features like ACID support, while many Document database lack this. This makes the database a good candidate for many software projects that need the productivity of storing schema-less documents combined with the advantages of traditional databases (eg multi document transactions).
PostgreSQL also has a huge supporting open source community and there are many tools and extensions. Some examples of these extensions are:
- PLV8 that enables the usage of JavaScript inside the database
- PGQ adds the support of queues inside the database (developed by Skype)
- Clustering with many different distribution models
References
I will probably blog more about this topic later as I started contributing to the OSS project. And I hope to be able to contribute more on this awesome project in the future.
In meanwhile you ca find more info here: