
Starten met de bouw van een nieuwe applicatie
Als je met de bouw van een nieuwe applicatie start, is één van de best practices zo snel mogelijk te focussen op die delen van de applicatie waar risico en onduidelijkheid zit. In al de rest stop je best zo weinig mogelijk energie tijdens de start van je project. Dat is de voornaamste reden waarom we bij de start van Elvive ervoor gekozen hebben om een NoSQL database te gebruiken om onze data te stockeren. Geen mapping overhead, weet je wel.
Selecteren van een NoSQL database
De vraag waar we toen mee zaten was uiteraard: welke NoSQL database zullen we gebruiken? Er zijn een hele reeks alternatieven: MongoDB, RavenDB, etc.
Uiteindelijk hebben we gekozen voor PostgreSQL. Tegenstrijdig genoeg een klassieke relationele database, maar wel met hele goede JSON support. Die JSON support heeft ertoe geleid dat de Marten library ontstond. Dit is een C# library die toelaat om PostgreSQL als document database te gebruiken.
Samengevat waren de drijfveren om voor de combinatie PostgreSQL – Marten te gaan de volgende:
- PostgreSQL is een bewezen databasetechnologie. Zelfs Azure biedt PostgreSQL (naast MySQL en uiteraard SQL Server) aan als een managed service.
- PostgreSQL en Marten zijn open source.
- PostgreSQL wordt beschouwd als referentie in de relationele database wereld voor wat betreft JSON support.
- Het gebruik van Marten is heel weinig intrusive. Je moet uiteraard geen mappings doen, maar bijvoorbeeld ook geen aparte query taal leren.
Marten under the hood
Is Marten nu echt zo vlot te gebruiken als beweerd wordt? Onze indrukken na een half jaar gebruik zijn alleszins positief.
Een loonberekening-instance bewaren in Elvive doen we bijvoorbeeld met volgende code:
_writableSession.Insert(loonberekening);
De enige plumbing code bestaat uit het starten van de sessie en de eigenlijke commit.
Het resultaat is dat de loonberekening-instance geserialiseerd wordt als JSON string en vervolgens weggeschreven in een tabel met volgende structuur.
PostgreSQL laat je toe om queries te schrijven waarbij je gebruik maakt van de individuele velden in de JSON data. Volgende query selecteert bijvoorbeeld alle loonberekening instances met een brutoloonwaarde groter dan 80.
Deze syntax moet je wel leren. Echt interessant wordt het dus pas wanneer je Marten gaat gebruiken om data op te vragen. In dat geval schrijf je gewoon een LINQ query in C# en Marten genereert de bijhorende SQL query.
De bovenstaande query formuleer je dan als volgt:
_querySession
.Query<LoonBerekening>()
.Where(berekening => berekening.BrutoTotaal > 80)
Cool, toch?
Marten biedt een hele reeks andere features zoals bijvoorbeeld de mogelijkheid code first te werken – zoals we nu doen in Elvive -, om (calculated) indexen te leggen op individuele velden, Javascript transformaties uit te voeren om bijvoorbeeld upgrades te doen, etc. Je vindt er alles over in de officiële Marten documentatie.
Zullen we PostgreSQL / Marten blijven gebruiken?
Het enige dat we hierover kunnen zeggen, is dat de ervaringen met Marten tot nu toe positief zijn. Elvive is daarnaast een typevoorbeeld van een applicatie waar een NoSQL zinvol kan gebruikt worden. Dat komt vooral omdat Elvive eigenlijk niet de master is van het merendeel van de data binnen Elvive. Het heeft dan ook geen zin om data te gaan normaliseren. Elvive is gebaat bij performance, die je vooral bereikt door net niet teveel te gaan joinen. Het zou dus best wel eens kunnen dat onze marters nog een tijdje ronddwalen op Corda Campus!