PostgreSQL voor alles
Introductie
Ik begon ongeveer in 2003 met het gebruik van PostgreSQL voor een onderzoeksproject genaamd ColumbaDB. Columba bestaat niet meer, maar PostgreSQL is levendiger dan ooit.
In 2003 werd MySQL veel vaker gebruikt dan PostgreSQL. MySQL was potentieel ook sneller, omdat het niet alle functies van de SQL-standaard implementeerde. Tegelijkertijd miste MySQL veel functies die wij nodig hadden, zoals full-text search, krachtige indexen en naleving van de SQL-standaard. PostgreSQL voelde in vergelijking met MySQL meer aan als een "echte" database — als een minuscule versie van Oracle, maar dan in open-source kleding.
Tijdens dat onderzoeksproject heb ik veel geleerd over databases, indexen en de kracht van PostgreSQL. Een belangrijk use-case was full-text search. We hadden MySQL kunnen gebruiken in combinatie met een ander systeem zoals Lucene of Solr om onze database doorzoekbaar te maken, maar dat had betekend dat we twee van dergelijke systemen moesten draaien en onderhouden. Dat was ingewikkeld.
PostgreSQL stelde ons in staat om een full-text search plugin te gebruiken om alles in één systeem te doen. Er was geen noodzaak om data te synchroniseren of twee systemen te onderhouden. Na wat aanpassingen werkte het simpelweg en was iedereen tevreden. Eenvoud.
Sindsdien heb ik PostgreSQL voor veel use-cases gebruikt gedurende mijn carrière als CTO en Interim Manager. Onlangs heb ik PostgreSQL gebruikt om zeer grote volumes aan webanalytics-tijdreeksgegevens op te slaan via de TimescaleDB-plugin. Kijk naar Privatracker — de beste manier om webanalytics te doen met respect voor de privacy van bezoekers — om dit in actie te zien.
Anderen hebben dit onderwerp vanuit verschillende hoeken besproken. Elk artikel is de tijd waard (zoals SQL is Agile en Stephan Schmidt over het gebruik van SQL voor alles). Ook mijn LinkedIn-bericht hierover is een aanrader. En als je PostgreSQL gebruikt, raad ik het bericht van Hazel Bachrach aan: "What I Wish Someone Told Me About Postgres".
Naar mijn bescheiden mening komt de kracht van PostgreSQL voort uit drie bronnen:
- Het is rotsvast en stabiel.
- Het is eenvoudig te draaien, installeren en schalen.
- Het vereenvoudigt je IT-setup enorm doordat het niet alleen een RDBMS is, maar ook een full-text search engine, een document-opslag en veel meer.
Laten we hier eens dieper op ingaan.
Rotsvast en stabiel
PostgreSQL is "saaie, oude" technologie. De eerste PostgreSQL-release stamt uit 1996. Het wordt al zeer lange tijd breed ingezet. Het uitbannen van bugs — zeker in databasesystemen — kost tijd, en PostgreSQL heeft die tijd gehad.
Er is bovendien een zeer actieve community die diligent nieuwe functies toevoegt zonder oude onderdelen te breken. In recente jaren heeft PostgreSQL geweldige functies gekregen, zoals JSON-documentopslag, partitioning-ondersteuning, common table expressions (CTE's) en veel meer. Elke nieuwe release van PostgreSQL is spannend en brengt nuttige nieuwe functies met zich mee.
Het is waar dat PostgreSQL oud is, maar de functies zijn zeer modern en de database wordt met elke release beter.
Eenvoudig te draaien, installeren en schalen
PostgreSQL kan zeer eenvoudig lokaal worden geïnstalleerd. Het is gebundeld bij alle grote Linux-distributies, onderdeel van Mac brew, en kan ook worden geïnstalleerd met applicaties zoals PostgresApp.
Bij het uitvoeren van tests is het gebruik van Testcontainers met PostgreSQL erg handig. Het is nog nooit zo makkelijk geweest om tests te draaien tegen een echte PostgreSQL-database die voor 100% identiek is aan de productieomgeving.
Als je PostgreSQL op een server wilt draaien, kun je simpelweg apt-get install gebruiken of het draaien in een Docker-container. Alle cloudproviders maken het mogelijk om PostgreSQL met één druk op de knop te draaien (en te schalen). Je hebt een ruime keuze:
- Amazon AWS
- Google GCP
- Microsoft Azure
- ElephantSQL
- CrunchyData
- Timescale
- ... en vele anderen.
Dit maakt PostgreSQL een van de meest breed ondersteunde softwaresystemen op de markt. Voor jou betekent dit minder onderhoud en meer tijd voor het creëren van nieuwe functies voor klanten.
Vereenvoudiging van je IT-setup
PostgreSQL in de cloud draaien is al een kwestie van één klik. Maar het wordt nog beter: PostgreSQL kan veel systemen vervangen die je anders apart zou moeten draaien.
PostgreSQL vervangt Solr en Elastic: Full-Text Search
PostgreSQL stelt je in staat om tekstdata om te zetten in doorzoekbare data, zonder een apart systeem. Het is taal-agnostisch en je zult nooit synchronisatieproblemen hebben tussen je data en je full-text search systeem.
Een indrukwekkend artikel hierover is hoe Contentful PostgreSQL gebruikte om full-text search mogelijk te maken voor hun gebruikers. Het is een verhaal van eenvoud die groei mogelijk maakt. Instacart deed iets soortgelijks: zij bouwden hun moderne zoekinfrastructuur op Postgres in plaats van een apart search-cluster te draaien.
Meer informatie: https://www.postgresql.org/docs/current/textsearch.html
PostgreSQL vervangt MongoDB: Uitstekende JSON-ondersteuning
PostgreSQL heeft uitstekende ondersteuning voor het opslaan en bevragen van JSON. Het beschikt ook over een index-type (GIN) dat deze operaties razendsnel maakt. Is er eigenlijk nog wel noodzaak voor MongoDB?
The Guardian schreef een uitstekend artikel over hoe zij overstapten van Mongo naar PostgreSQL. Ook Hazel schreef een mooi stuk over jsonb en waar je rekening mee moet houden bij het gebruik ervan.
PostgreSQL vervangt Kafka en RabbitMQ: PostgreSQL als queue
Events, queues en persistente logs worden steeds belangrijker in moderne softwaresystemen. Systemen zoals Kafka, RabbitMQ en SQS bieden deze functionaliteit, maar het onderhouden ervan is omslachtig en vereist specifieke kennis.
Het goede nieuws is dat je gewoon PostgreSQL kunt gebruiken. De magie komt voort uit:
SELECT .. FOR UPDATESELECT .. SKIP LOCKED
Met deze SQL-functies kun je een tabel effectief als queue gebruiken, ofwel persistent met een cursor en meerdere consumenten, ofwel in een "read-once" fashion. Het artikel bij Crunchy Data legt dit concept zeer goed uit.
Tip: Begin met PostgreSQL als queueing-systeem. Pas wanneer de prestaties onvoldoende zijn, stap je over op systemen zoals Kafka, RabbitMQ of SQS. Je zult verrast zijn hoe goed PostgreSQL werkt.
PostgreSQL vervangt Clickhouse: High Volume Time Series Data
Tijdreeksgegevens zijn speciaal. Vaak ontvang je veel datapunten in een zeer kort tijdsbestek, waarna je de data frequent moet aggregeren of statistieken moet berekenen.
Er zijn gespecialiseerde systemen zoals Clickhouse (die overigens geweldig is), maar je kunt ook een plugin voor PostgreSQL gebruiken die bijna hetzelfde kan: Timescale. Ik heb Timescale gebruikt en kan het aanbevelen. Het voordeel is dat je PostgreSQL kunt blijven gebruiken, zelfs voor high-volume data, zonder iets nieuws te hoeven leren of onderhouden.
PostgreSQL als Vector Database voor AI-workflows
Timescale heeft onlangs de pgvector-extensie uitgebracht, die van je PostgreSQL een vector-database maakt. Hiermee kun je de technologie die je al kent gebruiken voor het indexeren en ophalen van relevante data, wat een essentieel onderdeel is van AI LLM-workflows.
Timescale kondigde onlangs ook pgai aan, wat pgvector bevat maar ook andere extensies die het super simpel maken om data te indexeren, LLM-modellen aan te roepen en data op te halen op basis van similarity.
PostgreSQL vervangt Redis: Non-Persistent High Performance Caching
Caching is belangrijk. De meeste applicaties gebruiken iets als Redis als cache voor zaken als sessies. Een cache kan per definitie data verliezen, omdat deze opnieuw gegenereerd kan worden vanuit de bron.
Maar waarom Redis gebruiken als PostgreSQL zo kan worden afgesteld dat het (in de meeste use-cases) net zo snel is als een Redis-cache? Het geheim is het gebruik van een UNLOGGED tabel. Je kunt zelfs de automatische expiratie van Redis emuleren met een trigger. Er is veel over geschreven; ik raad aan het gewoon eens te proberen.
PostgreSQL vervangt het File System: Voor Raw Data
Voor een van mijn klanten moesten we een enorme hoeveelheid kleine stukjes binair gecodeerde informatie lezen en schrijven. In eerste instantie dachten we dat het bestandssysteem de snelste manier was.
Na performance-checks bleek dat PostgreSQL voor onze use-case zelfs sneller was dan lezen vanaf het bestandssysteem. PostgreSQL gebruikt het bestandssysteem zeer efficiënt voor zijn data en voegt caching en efficiënte lees- en schrijfacties toe die het schrijven en lezen van raw data op een bestandssysteem kunnen verslaan.
We gebruikten Flatbuffers om de data in een blob-kolom op te slaan, waarna de data aan de client-zijde werd gedeserialiseerd. Deze aanpak is wellicht ook voor anderen interessant.
PostgreSQL vervangt je Graph Database
Hiërarchische data kan in SQL worden beheerd via recursieve queries. Dat is mogelijk, maar vaak zeer lastig te lezen, te onderhouden en te debuggen, om nog maar te zwijgen van de performance.
Een betere manier is het LTREE-datatype van PostgreSQL. Dit heeft mij meerdere malen geholpen bij het implementeren van hiërarchische tag-structuren. Het is eenvoudig te lezen, te onderhouden en razendsnel.
PostgreSQL vervangt je Microservice
De meeste "microservices" tegenwoordig gaan alleen over modellen: data uit een database halen en deze als JSON naar de client terugsturen.
PostgreSQL kan echter elke query omzetten in een JSON-resultaat. Hiermee vervang je effectief je server-middleware. Er zijn voor- en nadelen aan deze aanpak, maar het toont de mogelijkheden van PostgreSQL. Lukas Eder schreef over dit onderwerp (niet specifiek voor PostgreSQL, maar alles wat daar wordt genoemd is zeer goed uitvoerbaar in PostgreSQL).
PostgreSQL — Vervangt je Playstation 5
Sommige enthousiastelingen hebben Tetris geïmplementeerd als Common Table Expressions in pure SQL. Dat is krankzinnig en moet waarschijnlijk niet te serieus worden genomen.
Conclusie
De bovenstaande lijst is niet uitputtend. PostgreSQL is een zeer flexibel stuk software en kan met plugins steeds verder worden uitgebreid.
Je hebt eenvoud nodig als je snel wilt bewegen. Wanneer je een nieuwe requirement tegenkomt, vraag je dan altijd af: "Kan PostgreSQL dit niet?" en "Hebben we die glimmende nieuwe technologie X echt nodig?".
PostgreSQL is misschien niet het antwoord op álles, maar het is het antwoord op veel meer dan je zou denken!
Groetjes,