Terug

Foreign Data Wrappers

Auteur: Thom van den Hork - Back-end Developer

Één van de belangrijkste onderdelen van een applicatie zijn databases. Helaas is het ook een van de onderdelen waar de minste aandacht aan wordt geschonken. Toch is dat jammer, want veel databases kun je op manieren gebruiken waar je in eerste instantie niet zo snel aan zou denken.

Bij Nerds & Company gebruiken wij al jaren PostgreSQL, dat al sinds 1996 bestaat. Het is samen met MySQL en MariaDB de meest gebruikte relationele database voor webapplicaties. Maar wat veel ontwikkelaars niet weten, is dat PostgreSQL ook de mogelijkheid heeft om uitbreidingen te installeren. In deze blog behandelen we een hele interessante, namelijk Foreign Data Wrappers.

Wat zijn Foreign Data Wrappers?

Foreign Data Wrappers zijn extensies voor PostgreSQL die het mogelijk maken om data van een externe bron in je PostgreSQL-database te laden. Dit kan bijvoorbeeld een andere PostgreSQL-database zijn, maar ook een MySQL- of NoSQL-database of CSV-bestand.

In 2003 werd er een nieuwe specificatie toegevoegd aan de SQL-standaard, namelijk SQL/MED ("SQL Management of External Data"). Dit was een poging om het benaderen van externe objecten in SQL te standaardiseren. Het duurde uiteindelijk nog zo’n acht jaar voordat PostgreSQL de eerste read-only-versie van Foreign Data Wrappers zou introduceren. In versie 9.3, twee jaar later, zou ook de mogelijkheid worden toegevoegd voor het wegschrijven van data.

Zoals hierboven al vermeld, bieden Foreign Data Wrappers de mogelijkheid om een verbinding op te zetten met andere databases. Hiervoor bestaan generieke oplossingen, zoals een ODBC- en JDBC-wrapper, maar ook zijn er database-specifieke wrappers beschikbaar. Daarnaast zijn Foreign Data Wrappers ook prima in te zetten voor het uitlezen van bestanden, zoals CSV, XML en JSON. Maar naast de logische toepassingen, zijn er ook wat bijzondere wrappers in omloop. Zo is het mogelijk om RSS-feeds, de Facebook-API en GIT uit te lezen. Meer voorbeelden zijn te vinden in dit overzicht.

Wat zijn de voordelen?

Het grootste voordeel is natuurlijk dat je data kunt benaderen alsof het onderdeel uitmaakt van je eigen database. In behoorlijk wat frameworks is het lastig om meerdere databases te koppelen en dankzij Foreign Data Wrappers hoeft dat uiteindelijk ook niet.

Het geeft je ook de mogelijkheid om data uit meerdere databases samen te voegen tot een view. Je kunt deze data dan benaderen alsof het uit een enkele tabel bestaat, terwijl het misschien wel uit drie verschillende tabellen uit drie verschillende databases bestaat. Dit zorgt er uiteindelijk voor dat je je code een stuk overzichtelijker kunt houden en data niet samen hoeft te voegen in je code.

Het laatste voordeel is dat je data niet in sync hoeft te houden, er is immers maar een bron. Je schrijft data weg via PostgreSQL, maar onder water zal de data alleen in de externe bron worden weggeschreven. Je hebt dus nooit te maken met data die niet meer in sync is en alle problemen die daarbij komen kijken.

Wat zijn de nadelen?

Natuurlijk hebben Foreign Data Wrappers niet alleen maar voordelen, anders zou iedereen het gebruiken. Het grootste nadeel is toch wel snelheid, omdat de data van het ene punt naar het andere punt moeten worden overgezet. Als je database op de juiste manier gestructureerd is, hoeft dit geen heel groot probleem te zijn overigens.

Een ander nadeel is dat er veel wrappers in omloop zijn, maar een groot deel daarvan niet af is en/of slecht onderhouden wordt. Je bent in zo’n geval afhankelijk van een wrapper, waar je zelf niet heel veel mee kunt, mocht er een fout in zitten. Natuurlijk heb je altijd de mogelijkheid om zelf een Foreign Data Wrapper te schrijven, maar daar gaat ook weer veel tijd en energie in zitten.

Wat ook lastig kan zijn, is het debuggen. Niet elke Foreign Data Wrapper geeft de fouten even goed weer en dat maakt het dus lastig om te achterhalen waar de fout precies zit.

Een laatste nadeel is dat veel database-specifieke functies niet worden ondersteund. Het kan bijvoorbeeld zijn dat je een functie gebruikt die alleen in MySQL zit, maar de meeste Foreign Data Wrappers ondersteunen echt alleen de basis-functionaliteit. Het hoeft natuurlijk geen groot nadeel te zijn als je hier vooraf rekening mee kunt houden.