In het algemeen geldt: alles kan, maar je moet je afvragen
hoe je het wilt doen.
Bijvoorbeeld: je kunt ook een spijker in de muur krijgen door er met een steen op te slaan, dus waarom zou je een hamer gebruiken? Misschien omdat een steen goedkoper is en sneller voorhanden? Het kan, en is ook niet onlogisch als je maar één spijker in de muur moet slaan.
Wat betreft MySQL en Postgres is het appels en peren vergelijken, gelijk de steen en de hamer. MySQL is bedoeld als simpele, ACID-compliant database engine voor simpele configuraties op een enkele plek. Omdat MySQL weinig voor je doet, is het ook een snelle database die minder resources gebruikt dan PostgreSQL. Omdat er nou eenmaal meer beginners zijn dan doorgewinterde professionals, is het voor hosters belangrijk om de kostprijs zo laag mogelijk te houden. Dus ligt MySQL binnen handbereik en moet je voor PostgreSQL net wat meer moeite doen.
PostgreSQL zit in een compleet ander segment, het is met recht de meest uitgebreide open source database ter wereld, het laat zich goed vergelijken met Oracle. De lijst van dingen die beter gaan in PostgreSQL in verhouding met MySQL is echt te lang voor in enkele post hier. MySQL kan zich niet meten met PostgreSQL of Oracle, daarom heeft Oracle MySQL ook overgekocht waarna de fork MariaDB is ontstaan. Dat maakt het ecosysteem ook niet overzichtelijker.
Uit eigen ervaring (16+ jaar MySQL, 7+ PostgreSQL) zal ik benoemen waar Ronnie meteen tegenaan kan lopen wanneer hij MySQL zou gebruiken, dat door de minimalistische opzet meer complexiteit met zich meebrengt voor een programmeur:
Neem datums. Hoe weet je vooraf zeker dat je datums op slaat die kloppen? Ga je ze zelf controleren in PHP? Of ga je toestaan dat gebruikers onzindatums in kunnen vullen als 2023-12-32? Of 2023-12-00?
Neem tijd. Hoe weet je vooraf zeker dat alle tijdrekeningen goed gaan, vooral met het oog op tijdzones? Misschien denk je dat het niet nodig is, maar in Nederland wisselen we 2x per jaar van tijdzone (wintertijd/zomertijd). MySQL kan geen tijdzones opslaan?
En als je datums en tijden in PHP controleert: gaan dat wel goed in de communicatie tussen MySQL en PHP? Heb je gecontroleerd dat ze op dezelfde server staan, met dezelfde wel op dezelfde server, met dezelfde locales? Zorg je er wel voor dat als je een backup moet restoren, dat je dezelfde locale gebruikt omdat anders de data corrupt raakt?
En neem de naam van de groep. Hoe lang mag die zijn? 20 tekens? 30? En als je dan een VARCHAR(30) aanmaakt, werkt het niet als er groepsnamen voorbij komen met diakritische tekens, omdat die meer ruimte innemen in MySQL? (MySQL rekent de lengte in bytes in plaats van in tekens). De standaardcodering in MySQL is alleen de eerste plane van Unicode, is dat genoeg?
Als je geen verdere datacorruptie wil, moet je zelf zorgen dat foreign key constraints überhaupt werken. Je moet weten dat MySQL een
database engine is, en geen
storage engine. En dat alleen de InnoDB storage engine dat ondersteunt. MySQL kent alleen een binary tree index, je kunt geen index maken op overlappende datums.
Als je één stapje verder bent met je applicatie, en er moeten mensen met verschillende rollen er mee werken (bijvoorbeeld verschillende groepen in plannen, verschillende dingen zien), dan heb je een rechtensysteem nodig. Je bent dan veel tijd kwijt in PHP om zoiets te verzinnen en op te zetten. Maar het wordt steeds lastiger (denk aan RLS) wanneer het programma verder zal groeien. In PostgreSQL zit het standaard, goedgekeurd door derde partijen en toepasbaar tot en met grootzakelijk gebruik.
Ben je nog wat verder, en je wilt fuzzy (= ongeveer) kunnen zoeken in de lijst van groepen, bijvoorbeeld vanwege diakritische tekens (= normaal in het Nederlands), hoe doe je dat in MySQL? In PostgreSQL kan het direct via standaardextenties die je alleen maar aan hoeft te zetten.
Natuurlijk kan je dit vast ook allemaal zelf in PHP en MySQL (met UDF's) gaan zitten bouwen.
Maar waarom zou je dat doen als diezelfde functionaliteit en garanties op gegevenskwaliteit al worden geboden door PostgreSQL?
Hoewel ik heb geprobeerd bovenstaande objectief te brengen, weet ik dat ik (net als met PHP) een een bias heb ten opzichte van MySQL. MySQL is in het verleden onderdeel geweest van meerdere frustraties. Vanwege de storage engines, vanwege onlogische ondersteuning voor Unicode in de transitie van Latin1 naar UTF-8, vanwege valkluilen van configuraties, en vanwege dat alles kan als je er zelf maar genoeg tijd in steekt om het allemaal zelf te bouwen.
Wanneer je een weloverwogen keuze wilt maken raad ik aan om ook te kijken naar wat anderen zeggen:
- IBM:
https://www.ibm.com/blog/postgresql-vs-mysql-whats-the-difference
- Kinsta:
https://kinsta.com/nl/blog/postgresql-vs-mysql
Ik werd na 16+ jaar gedoe met MySQL in ieder geval heel blij met PostgreSQL met het rechtensysteem (killer feature), het feit dat allerlei (voor mij) basisbehoeften geregeld waren die toen niet in MySQL geregeld waren, geen ingewikkeld technisch gedoe met meerdere engines, eigen datatypen, het hele ecosysteem, en meer. Ik heb de laatste 5 jaar dan ook niet veel meer naar MySQL omgekeken.