ASPNL logo (1 kb)
zondag 6 juli 2008




Microsoft MVP

.NET Codewise Community
<< vorige | overzicht | volgende >>

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.

<< vorige | ^ naar boven | overzicht | volgende >>
copyright 2000-2007 ASPNL