R2D2 > XML 2 RDB: de theorie > De DTD versimpelen

4.1 De DTD versimpelen

Er zijn een aantal manieren om de DTD te versimpelen. Toch is er ook één methode die alle algoritmes toepassen. Dit betreft de entity declarations die gebruikt worden voor verwijzing binnen de DTD. Deze worden verwijderd en vervolgens worden alle declaraties die naar een entity verwijzen vervangen door de DTD componenten die deze entities vertegenwoordigen. Een voorbeeld is:

<!ENTITY %txt "(#PCDATA)"> <!ELEMENT boektitel %txt >

Dit wordt:

<!ELEMENT boektitel (#PCDATA)>

Ook worden in de attribute type declaration de waarden voor de CDATA (zoals #IMPLIED, #FIXED, enz.) weggelaten. Hoewel in een database ook restricties worden aangegeven, wordt dit wel duidelijk bij het uitlezen van het XML bestand. Zeker wanneer het systeem voornamelijk gebruikt wordt voor archief functies en er dus weinig tot niets zal veranderen in de data. Als een systeem ook bedoeld is voor het onderhoud van de data zou dit meer problemen opleveren. In een dergelijk geval zou het eventueel wenselijk zijn deze informatie wel te bewaren. Zoals echter aangegeven in de inleiding is het systeem dat ik wil opzetten vooral bedoeld voor archivering doeleinden en daarom is het hier gerechtvaardigd de type declarations weg te laten.

De volgende stap is het elimineren van operatoren in de DTD. Hierdoor wordt de DTD geflattened en is de structuur beter te vangen in een database structuur. De verschillende algoritmes gaan hier verschillend mee om. Het GSE algoritme is het radicaalst. Bij de voorgestelde transformaties wordt de DTD het meeste 'plat geslagen'. Het DSE algoritme laat wat meer heel van de structuur en het IS algoritme houdt de meeste operatoren intact en versimpelt voornamelijk de geneste structuren in de DTD. Het ND algoritme tenslotte kent deze transformaties niet. Dit komt omdat dit algoritme niet werkt op een DTD maar rechtstreeks op de XML-data zelf. Hieronder staat een overzicht van de transformaties die de verschillende algoritmes voorstellen.

f* --> f
f+ --> f
f? --> f
f|f' --> f, f'
(f, f') --> f, f'
..., f,..., f,... --> f
Fig.1: Transformaties bij het GSE algoritme.
g* --> g*
g+ --> g*
g? --> g
g|g' --> g, g'
(g, g') --> g, g'
(g,g')* --> g*, g'*
..., g,..., g*,... --> g*
..., g,..., g,... --> g
Fig.2: Transformaties bij het DSE algoritme.
h+ --> h*
h** --> h*
h*? --> h*
h?* --> h*
h?? --> h?
(h, h')* --> h*, h'*
(h, h')? --> h?, h'?
(h | h') --> h?, h'?
..., h*, ..., h*, ... --> h*, ...
..., h*, ..., h?, ... --> h*, ...
..., h?, ..., h*, ... --> h*, ...
..., h?, ..., h?, ... --> h*, ...
..., h, ..., h, ... --> h*, ...
Fig.3: Transformaties bij het IS algoritme.

Deze transformaties zijn onder te verdelen in drie groepen:

Ik zal nu de simplification transformaties bespreken. Bij het GSE algoritme worden alle operatoren simpelweg verwijderd. Van alle elementen wordt dus uitgegaan dat ze precies 1 keer voorkomen. Veel informatie gaat op deze manier verloren en het is lastig op deze manier nog 1:M relaties te onderkennen. Het DSE algoritme verwijdert de ? operator en vervangt de + operator voor de * operator. Het IS algoritme tenslotte bewaard meer informatie omdat de ? operator niet verwijderd wordt.

De volgende set transformaties zijn de flattening transformaties. Bij alledrie de algoritmes worden de geneste gedeelten achterelkaar gezet. De | operator wordt vervangen door een , operator. Hiermee verdwijnt wel de informatie over volgorde binnen de elementen, maar, in tegenstelling tot de situatie binnen een DTD of XML-document, maakt dit niet uit in de database. In een database kan volgorde niet zonder hulpmiddelen worden weergegeven en hieraan wordt dan ook bij het uitlezen van de data aandacht besteed. De DSE en IS algoritmes hebben als extra regel dat eventuele operatoren om de geneste elementen toegekend worden aan zijn individuele elementen, iets dat in principe hetzelfde betekent, maar iets anders opgeschreven is. Omdat het IS algoritme de ? operator bewaard, wordt een genest statement met de | operator opgesplitst in zijn delen met een ? operator, gescheiden door een , operator.

De laatste groep transformaties zijn de grouping transformaties. De transformaties zorgen ervoor dat dezelfde elementen die meerdere keren voorkomen in een statement bij elkaar geplaatst worden. Het GSE algoritme heeft ook in deze stap geen operatoren en het DSE algoritme zorgt ervoor dat elementen zonder operatoren ook vervangen worden door één keer dat element zonder een operator. Dit is niet correct. Het feit dat een element meerder keren voorkomt, zegt al dat er een + operator geplaatst zou moeten worden, of op z'n minst een * operator. Het IS algoritme vervangt elementen wel door één keer dat element met een * operator, iets wat in het licht van de net aangevoerde reden ook als meer juist beschouwd kan worden.

Welke set transformaties moet nu gebruikt worden voor het versimpelen van de DTD. De transformaties van het GSE algoritme voldoen niet. Alle operatoren worden bij dit algoritme weggegooid en zo is er teveel informatie verlies.

Het IS algoritme bewaard weer teveel informatie door ook gebruik te maken van de ? operator. Dus ook dit algoritme voldoet niet.