terug naar blogs

Symfony ♥ PostgreSQL

PostgreSQL Logo
avatar van Colin
auteur
Colin
auteur
avatar van Colin
Colin
PostgreSQL & Symfony
11 april 2023 leestijd 6 minuten

Symfony, een populair PHP web application framework, ondersteunt dankzij Doctrine meerdere database backends, waaronder MySQL, PostgreSQL en SQLite. MySQL heeft volgens DB-engine dubbel zoveel installaties als PostgreSQL. Toch zien wij bij ons de vraag naar PostgreSQL in combinatie met Symfony toenemen. Waarom zou je daarvoor kiezen?

We vragen het Timo Bakx, lead backend developer bij webbureau Linku, en CARE team member van van Symfony: Binnen Linku zetten we Symfony vooral in voor webapplicaties, software op maat gemaakt voor een organisatie. Hiervoor maakte we voorheen altijd gebruik van MySQL als database backend. Maar voor twee nieuwe projecten leek MySQL niet meer toereikend. Dat was het moment dat we PostgreSQL eens goed gingen testen.

Performance bij veel data

Bij het eerste project zat de uitdaging vooral in hoeveelheid data. Het ging daarbij om miljoenen records. We merkte tijdens benchmarks met zoekopdrachten en indexeren dat PostgreSQL onder deze condities bijna de helft sneller was dan MySQL.
Ook features als materialized views helpen hierbij. Net als een view is deze opgebouwd uit een database query, maar is de data bij een materialized view opslagen op disk als ware een nieuwe table waarop je ook weer indexes kunt toepassen. Dit geeft een enorme performance winst, vooral bij veel databases en andere bronnen.

Fijnmazige security opties

Het tweede project verwerkte veel bijzondere persoonsgegevens. De borging van informatiebeveiliging wilden we hier niet laten afhangen van alleen de developer. Dit moesten we op een andere laag al afvangen.
PostgreSQL kon ons daarbij helpen dankzij de kracht van schemas. Hier kun je fijnmaziger de toegang tot een set aan data (bijvoorbeeld de resultaten van een JOIN) borgen.

Feature rich

PostgreSQL is wat betreft features een stuk rijker. Maar je gebruikt deze features eigenlijk alleen voor grotere applicaties of applicaties met een bijzondere usecase. Denk bijvoorbeeld aan de extension PostGIS. Hierdoor kun je zoeken binnen GEO coördinaten in je database. Dat zou met MySQL echt een stuk complexer worden. Of zoiets als triggers, dat zit zowel in MySQL als PostgreSQL. Maar in PostgreSQL kun je ook systeem commando’s laten uitvoeren na een trigger. Handig om bijvoorbeeld een profielfoto op te laten ruimen wanneer een gebruiker uit een database is verwijderd.
PostgreSQL heeft ook al sinds 9.2 de mogelijkheid om JSON data op te slaan. MySQL heeft deze ondersteuning sinds 5.7 ook, maar lang niet zo uitgebreid als in PostgreSQL. MySQL ondersteund bijvoorbeeld geen indexing van individuele elementen in JSON data, wat het zoeken binnen JSON data trager en minder efficiënt maakt. In systemen als WordPress zijn deze features allemaal niet aan de orde. Daar voldoet MySQL prima. MySQL zou bij kleinere datasets zelfs sneller zijn.

Migratie naar PostgreSQL

Dankzij Doctrine is een migratie van MySQL naar PostgreSQL eenvoudig. De verschillende veldtypen worden automatisch voor je omgezet. Maar natuurlijk mis je eventuele unieke features van een database management systeem wanneer je overstapt. Al is PostgreSQL hierin rijker dus zou de overstap naar MySQL voor grote applicaties een grotere uitdaging zijn. Zo kent PostgreSQL de UUID data type waarop je ook een volledige index kunt maken. In MySQL zou dit een VARCHAR worden waar je waarschijnlijk op alleen de eerste paar tekens een index maakt.
Een ander voorbeeld zijn autoincrements in MySQL. In PostgreSQL maak je hiervoor een sequence aan dat zich niet alleen beperkt tot één veld, maar zelfs kan worden ingezet over meerdere tables.

Slotconclusie van Timo is dan ook dat voor nieuwe Symfony projecten PostgreSQL de voorkeur heeft. Er is niet echt sprake van een flinke learningcurve, de basic query’s zijn gelijk. Maar bestaande projecten zomaar omzetten heeft geen meerwaarde. Als je de extra features niet mist dan is het de investering in tijd niet waard.

Security Hardening PostgreSQL

Een conclusie die Niels, een van de Linux engineers binnen Rootnet kan delen. Al ziet hij vanuit zijn rol ook wat andere verschillen met MySQL. Hardening, het goed afschermen van informatie, is bijvoorbeeld een stuk complexer. Iedereen die verbinding kan maken met een PostgreSQL database kan zien welke gebruikers en databases nog meer leven op een server. Net als bijvoorbeeld tables, als deze worden weggeschreven in de public schema wat by default het gedrag van PostgreSQL is. Het is mogelijk hier restricties op te leggen, maar je verliest dan vaak ook de goede werking van tools als pgAdmin die wel uitgaan van default gedrag.
Draait PostgreSQL op een eigen server voor één applicatie dan is dit niet meteen een probleem. Maar PostgreSQL aanbieden aan meerdere gebruikers vanaf één server is een grotere uitdaging als je de bovenstaande risico’s niet wilt accepteren.

Upgrades

Ook het upgrade proces van PostgreSQL zit net wat anders. Waar je MySQL eenvoudig kunt updaten naar een nieuwe versie zul je bij PostgreSQL altijd moeten werken met een migratie. Wil je van PostgreSQL 14 naar 15, dan zet je deze naast elkaar op en migreer je de databases naar de nieuwe server. Geen rocketscience, maar net iets minder eenvoudig dan MySQL waarbij je de bestaande installatie inclusief databases kunt updaten naar een andere versie.

Kiezen voor PostgreSQL?

Wil jij ook PostgreSQL gaan gebruiken voor Symfony? Vanuit onze portal rol je eenvoudig nieuwe projecten uit met de ideale configuratie voor Symfony. Met PostgreSQL, MySQL of gewoon beiden.