XML gegevensopslag
Door Michiel van Otegem
10 april 2007
Er zijn verschillende manieren op XML op te slaan. De meest voor de hand liggende is het
bestandssysteem, maar er zijn ook verschillende database types die hiervoor gebruikt kunnen worden.
Wat het beste is hangt van de situatie af.
Kleine applicaties die lage eisen stellen aan gegevensopslag, kunnen hun gegevens opslaan als
XML-bestanden op het bestandssysteem. Dit kan eigenlijk alleen als de applicatie kan garanderen
dat maar één gebruiker tegelijk gegevens kan wijzigen, anders is het vragen om problemen. In het
minst erge geval krijgt iemand een foutmelding omdat een bestand in gebruik is, maar in het ergste
geval wordt data zomaar overschreven en kan een inconsistente gegevensset ontstaan. Een ander
probleem van applicaties die gegevens opslaan als XML-bestanden is de snelheid. XML-bestanden
moeten ingelezen worden met een parser, en dat is een relatief tijdrovend proces, zeker naarmate
bestanden groter worden. Om een beetje snel te kunnen werken moeten de gegevens opgeslagen worden
in een cache, maar dat zal de ontwikkelaar helemaal zelf moeten verzorgen.
Wie serieus met XML aan de slag wil, komt daarom eigenlijk al gauw bij een database uit. Een
database zorgt voor een aantal belangrijke zaken die het mogelijk maken om met veel gebruikers
tegelijk te kunnen werken met dezelfde gegevens. Om te beginnen uiteraard dat de gegevens
consistent blijven terwijl meerdere mensen wijzigingen kunnen maken, maar ook het snel kunnen
opzoeken van gegevens door het gebruik van indexen, voorgedefinieerde query’s en caching. Door de
jaren heen zijn er verschillende soorten databases ontwikkeld, zoals hiërarchische databases en
object databases. Het dominante model vandaag de dag is echter de relationele database. Een
relationele database bestaat uit tabellen met een vast aantal kolommen. Tussen de tabellen kunnen
relaties bestaan (vandaar dat we spreken van "relationele" databases). Deze structuur zorgt ervoor
dat relationele databases uitermate geschikt zijn voor het opslaan en bewerken van gestructureerde
gegevens. Zolang de gegevens voldoen aan de structuur van de database, kan de snelheid hiervan tot
enorme hoogtes groeien. Dat is echter ook meteen waar de zaak wrikt. Niet alle gegevens zijn zo
sterk gestructureerd. Er zijn situaties waarin je soms bepaalde velden niet hebt en soms wel, en
dan kunnen ze ook nog wel eens meerdere keren voorkomen. Dit soort onzekerheden kan een relationele
database niet echt goed mee overweg. Daarnaast is het ook nog eens zo dat er vaak een vertaalslag
moet plaatsvinden tussen de manier waarop een applicatie gegevens gebruikt, en de manier waarop ze
opgeslagen worden in een database. Dit geldt zeker voor object georiënteerd programmeren, omdat
objecten nu eenmaal niet één-op-één te vertalen zijn naar een database schema. Toch is het
relationele model voor veel applicaties de beste oplossing, want juist de rigide structuur maakt
een relationele database relatief eenvoudig om te gebruiken vanuit een applicatie, ervan uitgaande
dat de gegevens op een of andere manier efficiënt vertaald kunnen worden naar het database schema.
Door de technieken om XML om te zetten in een tabelstructuur en weer terug geldt dit ook als er
met XML gewerkt wordt, althans tot op een zekere hoogte. Zolang een XML-document een redelijk
vaste structuur heeft, is deze structuur om te zetten in een relationele structuur. Veel van de
huidige database producten zoals Microsoft SQL Server, Oracle, en IBM DB2 bieden manieren om
gegevens in een database te ontsluiten als XML, en om via XML gegevens in de database bij te
werken. Ook bieden deze producten in meer of mindere mate de mogelijkheid om die gegevens meteen
te verwerken met een parser of XSLT processor, om zo de gegevens aan te bieden in een formaat waar
de applicatie die ze opvraagt wat aan heeft. Dit kan zelfs zover gaan dat de gegevens on-the-fly
tot HTML verwerkt worden en aan de gebruiker getoond worden via een browser. Er zijn echter ook
allerlei scenario’s denkbaar waarin twee systemen gegevens uitwisselen. Juist omdat XML een
algemeen geaccepteerde standaard is, werkt dit uitstekend, zelfs tussen verschillende platformen.
XML databases
Tot nog toe ging het alleen over gestructureerde gegevens. Het relationele database model is zo
verfijnd dat er geen beter opslag is voor gestructureerde gegevens. Zelfs als deze gegevens
vervolgens als XML of een ander formaat aangeboden worden is de snelheid van deze systemen
vooralsnog niet te verkrijgen met andere soorten gegevensopslag. Als we echter over XML documenten
praten met de semi-gestructureerd of ad hoc zijn, bijvoorbeeld een in XML opgemaakt tekstdocument,
verandert hetspeelveld enorm. Bij dergelijke documenten is binnen het relationele model vaak de
enige oplossing ze als geheel in een tekst-veld op te slaan in de database. Het nadeel daarvan is
echter dat je niet meer zo snel bepaalde gegevens kunt opvragen, omdat voor de database de XML
niets meer is dan platte tekst. Daardoor is het voor de database niet mogelijk iets te vergelijken
op basis van de waarde van een bepaald element of attribuut. Zoek je een element met een bepaalde
waarde, dan zul je eerst het XML document moeten inlezen en doorzoeken, waardoor je niet al op de
XML filters aan kunt leggen. Zijn er veel (en zo mogelijk grote) documenten opgeslagen die je moet
doorzoeken, dan is dit feitelijk onhaalbaar. Een oplossing hiervoor is een nieuw type database:
de XML database. Dit type database maakt al enkele jaren een gestage opmars in de wereld van de
gegevensopslag. Vooral document management systemen maken veel gebruik dit soort databases, omdat
deze databases juist erg goed overweg kunnen met semi-gestructureerde- en ongestructureerde XML.
Documenten (zoals dit artikel bijvoorbeeld) behoren vrijwel per definitie tot die categorie, omdat
elk document een andere structuur heeft. Waar je een platte tekst onderbreekt voor een kop, vette
tekst, een citaat, enzovoorts is namelijk voor ieder document anders.
In een XML database worden gegevens op een andere manier opgeslagen dan in een relationele database, hoewel een relationele database bij sommige producten nog wel de grondslag vormt. Hoe de XML opgeslagen wordt, laat je echter over aan het systeem. Dit in tegenstelling tot een relationele database, waarbij wij de structuur van de gegevensopslag bepalen. Met complexe structuren zoals XML, is het systeem echter vele malen efficiënter dan dat wij dat zijn. Door de XML op een andere manier op te slaan, bijvoorbeeld als een persistente vorm van het Document Object Model, zijn alle gegevens direct als XML te benaderen, zonder dat daar een parser aan te pas hoeft te komen. In XML databases wordt om gegevens te selecteren gebruik gemaakt van XPath en XQuery, in plaats van een aangepaste vorm van SQL, zoals gebruikelijk bij relationele databases waaruit XML op te vragen is. Een kanttekening die hier geplaatst moet worden is dat XQuery nog steeds geen standaard is, terwijl enkele XML databases er al enkele jaren gebruik van maken in een van de verschijningsvormen die het heeft gehad sinds de ontwikkeling door het W3 Consortium gestart is. Hierdoor maken de verschillende producten gebruik van verschillende types XQuery, soms zelfs aangepast aan het eigen systeem.
Een XML database lijkt de ultieme oplossing. Alle gegevens die in een relationele database opgeslagen worden kun je ook in een XML structuur vertalen. Zo kun je beide modellen in één database zetten. Dit blijkt echter geen haalbare kaart. XML databases blijken dermate traag dat ze niet alleen duur zijn als product, ze zeer zeker duur zijn als oplossing. Een XML database vergt vele malen zwaardere, en dus duurdere, hardware om goed uit de verf te komen, als je het vergelijkt met een relationele database. Dat is ook niet gek gezien de decennia aan ontwikkeling die al in het relationele model geïnvesteerd zijn. Vaak zijn alleen al de kosten die ermee gemoeid zijn genoeg om toch te kiezen voor een relationele database, ondanks de problemen die daarmee in een project overwonnen moeten worden.
Hybride databases
Sinds enige tijd is er nog een derde type database voor de opslag van XML, een hybride database.
Microsoft SQL Server 2005 (codenaam Yukon) dat halverwege 2005 op de markt moet komen is hiervan
een goed voorbeeld. Het probeert de voordelen van zowel relationele databases als XML databases
in één model te verenigen. SQL Server 2005 is in feite een relationele database, maar heeft een
aantal additionele functionaliteiten die het werken met XML makkelijker moet maken. Ten eerste
kun je met hulp van SQL Server een vertaalschema vastleggen om een XML document op te slaan in
een tabelstructuur die je gedefinieerd hebt. Hierdoor kun je zowel gegevens als XML opvragen als
XML opslaan. Dit is eigenlijk niet meer dan een verbetering van de SQLXML tool die je kunt
gebruiken met de huidige versie van SQL Server. Interessanter is een nieuw type veld: het XML type.
In dit veld kun je hele XML documenten opslaan in hun oorspronkelijke vorm. In tegenstelling tot
een tekstveld wordt dit veld echter geïndexeerd op een speciale manier. Hierdoor kun je door
gebruik te maken van XQuery (al dan niet al onderdeel van een SQL query) gegevens opvragen door
te filteren op gegevens in het XML document. Hoewel dit niet zo snel is als pure relationele
tabellen, biedt het een enorme verbetering ten opzicht van de huidige situatie. Omdat SQL Server
2005 echt een Best-Of-Both-Worlds aanpak heeft, is het een product met enorme potentie, omdat het
de brug slaat tussen het relationele model en het XML model. Microsoft heeft de strategische keuze
gemaakt niet naast SQL Server een XML database in de markt te zetten, maar het SQL Server product
te versterken.
De toekomst zal moeten leren of XML databases uiteindelijk echt een serieus alternatief zullen
vormen voor relationele databases. Dit lijkt serieus ondermijnd te worden door de opkomst van de
hybride database, hoewel die zich nog in de praktijk waar zal moeten maken. Doordat de grote
spelers op de relationele markt voor deze route zullen kiezen is het echter aannemelijk dat de
hybride vorm de overhand zal krijgen, al is het maar omdat bestaande gebruikers over het algemeen
bij hun product blijven. Saai zal het in deze arena in elk geval niet worden, en er is veel te
leren voor ontwikkelaars en database administrators. Er zullen ongetwijfeld nieuwe inzichten nodig
zijn om hybride databases net zo effectief te laten werken als relationele databases als er ook
druk gebruik gemaakt wordt van de XML capaciteiten.
Dit artikel is eerder verschenen in NetOpus, juni 2004.
|