Normalisert datamodell for studieomtaler.
Jeg tok utgangspunkt i studieomtalene for (daværende) Høgskolen i Telemark fra 2006, og plukket ut 1 studium og 6 emner: Rådatafil.
Jeg valgte å ta med følgende informasjon:
Modellen åpner altså for å lagre flere versjoner av studieomtalene, en for hvert studieår. Hver versjon inneholder beskrivelser av mange studier og emner.
Et studium inneholder mange emner, og et emne kan inngå i mange studier. Attributtet semester er et tall, som for eksempel sier at emne X er lagt til 4. semester i studium Y. Identifikator for Oppbygging er satt sammen av identifikator for Studium (Aar og StudiumKode) og identifikator for Emne (EmneKode).
Attributtene Faginnhold, Opptak, Omfang, Innhold og Evaluering er tekster, som kan lagres med datatype VARCHAR eller CLOB (eller kanskje XML).
Logisk tabellstruktur blir som følger:
XML-representasjon av studieomtalene.
De to XML-filene skiller seg kun ved referansen til henholdsvis skjema og DTD.
Filene er antatt lagret på katalog https://dbsys.info/Databasesystemer/2_Losninger/kap14xml. For testing bør man laste ned filene og erstatte referanser til denne katalogen med egen webkatalog.
DTD for studieomtalene.
XML Schema for studieomtalene.
XSLT
Følgende filer presenterer studieomtalene i fullversjon og i kortversjon ved hjelp av XSLT. Fullversjonen er laget både for bruk med XML-filen som refererer til skjemafil (navnerom) og DTD (uten navnerom). XML-filene i løsningen til oppgave 1b refererer til stilark som presenterer en full versjon av studieomtalene. Legger her også ut en XML-fil som refererer til stilark som viser kort versjon. De forskjellige XML-filene skiller seg kun ved forskjellige "besvergelser" i prologen.
Filene er antatt lagret på katalog https://dbsys.info/Databasesystemer/2_Losninger/kap14xml. For testing bør man laste ned filene og erstatte referanser til denne katalogen med egen webkatalog.
Navn og studiepoeng for kurs i et bestemt studium ved hjelp av XQuery.
<table>
{
for
$handbok in doc("studiehandbok.xml")/studiehandbok
$kode in $handbok[studiumkode="220 187"]/oppbygging/emnelink/kode
$emne in $handbok/emne[kode=$kode]
order by $emne/navn
return <tr><td>{$emne/navn}</td><td>{$emne/navn}</td></tr>
}
</table>
Samlet antall studiepoeng for obligatoriske emner i hvert studium ved hjelp av XQuery.
<table>
{
for
$handbok in doc("studiehandbok.xml")/studiehandbok
$studium in $handbok/studium
$kode in $studium/oppbygging/emnelink/kode
$omfang in $handbok/emne[kode=$kode]/omfang
order by $emne/navn
return <tr><td>{data($studium/studiumnavn)}</td><td>
{data(SUM($omfang))}</td></tr>}
</table>
XML-representasjon av tabellene i oppgave 1a ved hjelp av SQL/XML.
Viser teknikken for tabellen Emne, der kode blir til attributt og øvrige kolonner til underelementer:
SELECT
XMLElement("emne",
XMLAttributes(kode AS "kode"),
XMLForest(navn AS "navn",omfang AS "omfang",
innhold AS "innhold", evaluering AS "evaluering")).extract('/*') XML
FROM Emne;
Merk at spørreresultatet vil bestå av et antall rader, der hver rad inneholder ett emne-element. For å lage et XML-dokument av spørreresultatet kan man behandle det som tekst, og legge på et omsluttende rot-element.
Oracle tilbyr en enkel måte å transformere tabeller til XML. Hvis Emne er en tabell i skjemaet til brukeren scott, vil følgende SQL-kommando lage XML av tabellen:
SELECT DbURIType.CreateURI('/scott/Emne').getXML() FROM dual;
XML-representasjon av tabellene i oppgave 1a ved hjelp av SQL/XML.
De delene av studieomtalene som er plukket ut følger et såpass strengt mønster at det går greit å lage en normalisert datamodell (tabell-representasjon). Jeg mener at man i slike tilfeller bør velge en ren tabellrepresentasjon fordi jeg synes at en slik struktur er enklere å jobbe med enn tilsvarende XML-representasjon (blant annet ved bruk av SQL). Det finnes nok dem som er uenige i dette!
Hvis man ønsker en friere struktur, for eksempel at de tekstlige beskrivelsene (faginnhold for studier, evaluering for emner med flere) skal kunne bestå av flere "avsnitt" med formatering som lister, fet skrift og så videre, blir en normalisert datamodell for streng. I slike tilfeller kan en hybridmodell være hensiktsmessig. I Oracle kan man da definere at visse kolonner innholder XML (datatype XMLType).
Om bruk av XML Schema og DTD: DTD er som nevnt i avsnitt 14.4.1 er relativt svakt språk; man har ikke datatyper, det er dårlig støtte for forretningsregler (herunder primærnøkler og fremmednøkler), har en sær syntaks og støtter ikke navnerom. Fordelen med DTD (i forhold til XML Schema) er først og fremst at det er enkelt; det er enkelt å lage en DTD, og det er enkelt å lese (forklarer hovedstrukturen til et XML-dokument på en enkel måte).
Eksempler hentet fra studieomtalene: Med XML Schema får man sagt at årstall er et heltall (og får begrenset dette ytterligere til fornuftige verdier), at emnekode består av 4 sifre, at lovlig semester er et heltall (1 til 6 for 3-årige utdanninger). Man kunne også definert kode som primærnøkkel for emne, og definert emnekoden i emne/studium som fremmednøkkel.
Logisk datamodell
En logisk tabellstruktur for en relasjonsdatabase kan se ut som følger:
Som vist under kan vi representere denne tabellstrukturen ganske direkte i XML. Til ekstraspørsmålet om redundans: Hvis tabellene inneholder redundans, så vil også XML-filene gjøre det.
Eksempel på DTD for å beskrive samme innhold med XML:
<!ELEMENT prosjektdata ((prosjekt)*, (ansatt)*, (prosjektdeltakelse)*)>
<!ELEMENT prosjekt (budsjett,startdato,(sluttdato)?)>
<!ELEMENT ansatt (fornavn,etternavn)>
<!ELEMENT prosjektdeltakelse (antalltimer)>
<!ELEMENT prosjektnr (#PCDATA)>
<!ELEMENT budsjett(#PCDATA)>
<!ELEMENT startdato(#PCDATA)>
<!ELEMENT sluttdato(#PCDATA)>
<!ELEMENT ansnr(#PCDATA)>
<!ELEMENT fornavn(#PCDATA)>
<!ELEMENT etternavn(#PCDATA)>
<!ELEMENT ansnr(#PCDATA)>
<!ELEMENT prosjektnr(#PCDATA)>
<!ELEMENT antalltimer(#PCDATA)>
<!ATTLIST prosjekt prosjektnr CDATA #REQUIRED>
<!ATTLIST ansatt ansattnr CDATA #REQUIRED>
<!ATTLIST prosjektdeltakelse prosjektnr CDATA #REQUIRED>
<!ATTLIST prosjektdeltakelse ansatttnr CDATA #REQUIRED>
Eksempel på XML-fil som følger DTD'en over:
<?xml version="1.0" encoding="ISO-8859-1"?>
<prosjektdata>
<prosjekt prosjektnr="1">
<budsjett>520000</budsjett>
<startdato>20.03.2019</startdato>
<sluttdato>16.02.2020</sluttdato>
</prosjekt>
<prosjekt prosjektnr="2">
<budsjett>675000</budsjett>
<startdato>19.12.2020</startdato>
</prosjekt>
<ansatt ansnr="101">
<fornavn>Per</fornavn>
<etternavn>Hansen</etternavn>
</ansatt>
<ansatt ansnr="102">
<fornavn>Kari</fornavn>
<etternavn>Lie</etternavn>
</ansatt>
<prosjektdeltakelse prosjektnr="1" ansnr="101">
<antalltimer>10</antalltimer>
</prosjektdeltakelse>
<prosjektdeltakelse prosjektnr="1" ansnr="102">
<antalltimer>15</antalltimer>
</prosjektdeltakelse>
<prosjektdeltakelse prosjektnr="2" ansnr="102">
<antalltimer>14</antalltimer>
</prosjektdeltakelse>
</prosjektdata>
Bilutleie
Løsningsforslag foreligger ikke.
Import og eksport
Denne oppgaven gikk ut på å teste ut muligheter for import og eksport.