|
Tags: Programmeren | SQL
| ||
| ||
Terug naar SQL krassenEfficiënter databasegebruik door innovatieve codeTekst en foto’s: Frans M. KantersDe hedendaagse softwareontwikkeling drijft op relationele databases en objectgeoriënteerde programmeertalen. Twee relatief verschillende werelden die niet zonder elkaar kunnen, maar ook voor lastige vraagstukken zorgen. Charta Software heeft het spreekwoordelijke ei van Columbus ontwikkeld waardoor beide werelden beter kunnen samenwerken. De kern van de boodschap is een eerherstel voor de taal SQL.In een ambiance die ondernemerschap pur sang ademt, is het historische Groot Handelsgebouw in Rotterdam toneel voor het interview met de twee grondleggers van Charta Software Karsten Uil en Peter-Jan Roes. De bedrijfsnaam is gedeeltelijk ontleend aan het Engelse woord charts, dat staat voor landkaarten, maar ook voor het in kaart brengen van gegevens. De bedrijfsnaam is niet voor niets gekozen. Naast het ontwikkelen van wiskundige applicaties ontwikkelt Charta Software methoden om het programmeren zelf te verbeteren, waarbij het ontrafelen en in kaart brengen van logische structuren van de code belangrijk is. Objectgeoriënteerde talen en relationele databasesHet nog steeds groeiend gebruik van relationele databases in combinatie met objectgeoriënteerde programmeertalen zoals Java, Delphi en tegenwoordig ook PHP heeft zo zijn achtergronden. Relationele gegevensverzamelingen zijn sterk in het gestructureerd opslaan van gegevens, en het vervolgens weer terugvragen daarvan door middel van queries. Objectgeoriënteerd programmeren is populair omdat het de programmeur in staat stelt om met behulp van polymorfisme (principe dat een object verschillende vormen en gedaantes kan aannemen) het gedrag van applicaties te beschrijven. Resultaat zijn programma’s die beter functioneren in een continu veranderende omgeving. De combinatie van beide denkbeelden bezorgt menig softwareontwikkelaar een inmiddels klassiek probleem. Beide omgevingen hebben namelijk een volstrekt andere benadering voor het benaderen van informatie. In programmeursland staat dit probleem bekend als object-relational impedance mismatch. Ofwel de problemen die ontstaan op zowel conceptueel als technisch vlak als een relationeel database systeem wordt gebruikt in combinatie met een applicatie die is ontwikkeld met objectgeoriënteerde denkbeelden.Krachtige taalHet hart van veel applicaties is het databaseontwerp en de wijze dat de gegevens benaderd worden. Over het databaseontwerp wordt, als het goed is, goed nagedacht en vervolgens is voor relationele databases de natuurlijke taal om de database te bevragen en er commando's op uit te voeren SQL (“Structured Query Language”). Deze krachtige taal stelt de programmeur in staat om elke gewenste opvraag van gegevens uit een gegevensverzameling goed te formuleren en efficiënt te realiseren.SQL biedt een aantal handvatten voor de ontwikkeling van data intensieve applicaties. Denk aan het tegelijkertijd halen van informatie uit meerdere tabellen, het hergebruiken van een SQL query in weer andere queries en het efficiënte resultaat dat een query oplevert: er kan namelijk exact worden aangegeven welke informatie nodig is. Ook biedt SQL geavanceerde aggregatie van informatie en sorteerfuncties en kan met een enkel commando een forse set aan rijen worden aangepast of ingevoegd. Tot slot werkt SQL declaratief. Dit wil zeggen dat de programmeur heel specifiek aangeeft wat er moet gebeuren en niet hoe het moet gebeuren. De database weet vervolgens zelf - mits voldoende goed afgestemd - hoe het resultaat zo efficiënt mogelijk kan worden bereikt. Dit is slechts een bloemlezing van de pluspunten van SQL. Het generen van de juiste SQL code is één van de problemen die door object-relational impedance mismatch wordt veroorzaakt. SQL stringsIn programmeertalen worden SQL commando’s samengesteld door het aan elkaar plakken van stukjes tekst (string constanten). Hiermee wordt de programmeertaal gefopt. De voor de programmeertaal betekenisloze tekst geeft in werkelijkheid SQL commando’s weer die een belangrijk deel van de applicatie vormen. De programmeertaal is echter onbekend met de syntaxregels van die commando’s. Het gevolg is dat de samengestelde SQL pas runtime (wanneer de applicatie draait) kan worden getest en fouten kunnen worden opgespoord. Een voorbeeld is het vergeten van een spatie of het in een routine aanspreken van kolomnamen die helemaal niet bestaan. Dit kost extra test- en programmeertijd en kan ervoor zorgen dat het uiteindelijke ontwikkelingstraject van een nieuwe applicatie aanzienlijk duurder uitpakt. Hierdoor is het samenstellen van de queries een erg risicovol deel van de softwareontwikkeling geworden.Object relational mappingEen oplossing aangedragen door de markt voor de eerder genoemde object relational impedance mismatch en het gebruiken van het aan elkaar plakken van string constanten is object relational mapping (ORM). ORM is de techniek waarbij objectgeoriënteerde objecten en classes worden geprojecteerd – in jargon mapped – op relationele databasetabellen. De IT industrie kent inmiddels een aantal ORM frameworks, zoals Hibernate, TopLink en OpenJPA. De bij een groot publiek bekende iTunes muziekwinkel draait trouwens volledig onder één van deze ORM toepassingen.Nadelen ORM frameworksEen goed geïmplementeerd ORM framework lost het beschreven probleem van de letterlijke strings op. De ontwikkelaar denkt en programmeert alleen in de objectgeoriënteerde wereld het het framework vertaalt zoekacties en aanpassingen naar nette SQL queries. Toch is deze oplossing verre van ideaal. De programmeur wordt namelijk afgeschermd van de database. Dit terwijl de databasestructuur het gestelde hart is van de applicatie en veel logica (business logic) voor de eindgebruikers bevat. Daarnaast wordt er aan voorbij gegaan dat de natuurlijke manier om de relationele database te benaderen SQL is. Hierdoor wordt niet de volledige kracht van SQL gebruikt en kan er niet optimaal gebruik worden gemaakt van de database. Dit laatste wordt opgelost in ORM systemen door een vorm van “letterlijke” SQL toe te staan. Tot slot is het de vraag of projecteren van een class op een tabel theoretisch gezien zuiver is.Ander geluidDe volledige dynamische aard van SQL laat zich lastig vatten in een objectgeoriënteerde programmeertaal. Dit probleem blijft als alleen gebruik gemaakt wordt van de beschreven vertaalslag (ORM) tussen classes en tabellen. Kortom, de moderne programmeertalen bieden onvoldoende ondersteuning voor een optimale inzet van SQL in een relationele databaseomgeving. De hieronder gepresenteerde oplossing voor het geschetste vraagstuk is een manier waarmee SQL teruggebracht kan worden naar de programmeertaal.Integratie bouwstenen SQL in JAVAHet idee is dat alle elementaire bouwstenen van SQL worden nagemaakt als bouwstenen in de objectgeoriënteerde programmeertaal van keus. Uitgaande van bijvoorbeeld Java betekent dit dat de SQL bouwstenen als Java classes, objecten en functies worden gemodelleerd. Elke bouwsteen heeft het vermogen om zijn eigen stuk corresponderend SQL code te genereren. Door meerdere Java bouwstenen te combineren ontstaat de uiteindelijke SQL waarmee de database kan worden bevraagd.Deze benadering voorkomt dat een programmeur moet gaan werken met string constanten waarmee de SQL commando’s in Java geïntegreerd worden. Dit lost het probleem op zoals eerder beschreven van de letterlijke strings, waarvan Java zelf feitelijk niets van begrijpt. Daarnaast zorgt het gebruik van in Java gemodelleerde bouwstenen ervoor dat de ontwikkelomgeving kan gaan assisteren in het samenstellen van SQL commando's door middel van code completion of het in een vroeg stadium aangeven van fouten (compile time in plaats van run time). De compiler assisteert namelijk de programmeur bij het samenstellen van de SQL commando’s. Een ander belangrijk voordeel is dat databaseveranderingen eenvoudiger gerealiseerd kunnen worden. Waar traditioneel een database structuurwijziging vele mandagen programmeer- en testwerk oplevert, zorgt de gestelde structuur ervoor dat de meeste problemen al door de programmeertaal opgespoord worden. Het voorbeeld in de tabel hiernaast laat zien hoe de aanpak in elkaar steekt. Het bovenste kader geeft de code weer zoals traditioneel gebruikelijk is. Recht toe recht aan Java met daarin een aantal strings. Het kader daaronder laat de nieuwe aanpak zien. De oplossing van Charta Software ten opzichte van de ORM systemen heeft als duidelijk voordeel dat optimaal gecommuniceerd wordt met de database en de programmeur vanuit de programmeertaal weer bezig kan zijn met de logica van de database. Tot slot kan de methode ook gebruikt worden om de door frameworks gebruikte SQL (bijvoorbeeld HQL) kwalitatief te verbeteren. Deze aanpak is direct toepasbaar in de meeste objectgeoriënteerde programmeertalen. Het biedt hiermee een tegengeluid in de markt van softwarebouwers. Voor alle duidelijkheid: de aanpak kan prima functioneren naast de bekende ORM oplossingen. De vraag is of deze ORM oplossingen überhaupt nodig zijn. De voordelen van de Charta aanpak voor u op een rij:
ToekomstEen toekomstvoorspelling is lastig. Duidelijk is wel dat de kritiek vanuit de softwaremarkt op de ingeslagen ORM weg luider wordt. Om relationele databases goed te gebruiken zal SQL moeten terugkeren als vast element binnen objectgeoriënteerde programmeertalen. Hierdoor lijkt de rol van ORM frameworks eindig. Een stap verder is dat SQL in zijn natuurlijke vorm (set echte keywords) zal worden opgenomen binnen de objectgeoriënteerde programmeertalen. Vooralsnog is dit een ideaalbeeld en zullen bedrijven als Charta Software de ingeslagen kruistocht moeten voortzetten. Want wie wil er nu niet foutlozer en sneller applicaties kunnen ontwikkelen en toch efficiënt en natuurlijk de database kunnen aanspreken en benaderen? De Charta aanpak lijkt het krassen in SQL nieuwe leven in te blazen. | ||
| Lees meer over Charta Software | ||
| Ga terug naar We Love IT uitgave #2 - 2008 | ||
|




