IDATT2002 – NTNU Databaser v26
| Dato: | 22. mai 2026 |
| Tid: | 09:00 – 13:00 (4 timer) |
| Hjelpemidler: | Kode E – Ingen hjelpemidler tillatt |
| Vekting: | Oppgave 1: 40% | Oppgave 2: 40% | Oppgave 3: 20% |
ER-diagrammet nedenfor er en forenklet database for et biblioteksystem. Systemet holder rede på bøker, forfattere, medlemmer og utlån. En bok kan ha én eller flere forfattere, og en forfatter kan ha skrevet flere bøker. Et medlem kan låne flere bøker over tid, og samme bok kan lånes ut flere ganger (men kun til én person av gangen). En bok tilhører én sjanger. En utlånsregistrering har en utlånsdato og en innleveringsfrist.
Primærnøkler er ikke tegnet inn i ER-diagrammet. Foreslå en primærnøkkel for hver entitetstype. Du kan utvide med nye attributter hvis du synes det er hensiktsmessig. Begrunn kort forslagene dine.
Oversett ER-diagrammet til relasjonell form. Understrek primærnøkler og marker fremmednøkler med *. Du skal ikke skrive CREATE TABLE eller foreslå datatyper.
En bok kan ha mange forfattere, og en forfatter kan ha skrevet mange bøker. Hvilken tabellstruktur er riktig oversettelse av denne mange-til-mange-relasjonen?
Biblioteket ønsker å registrere hvilke sjangere et medlem er interessert i, slik at de kan få anbefalinger. Et medlem kan være interessert i null eller flere sjangere. Foreslå med tekst en utvidelse av databasen for dette, og vis hvilke endringer i løsningen fra 1b) dette medfører. Du skal ikke tegne et nytt ER-diagram.
Tabellene nedenfor representerer en forenklet database for et kinoanlegg. Primærnøkler er streket under, fremmednøkler er markert med *.
En visning er én konkret forestilling av én film i én sal på en gitt dato og tidspunkt. Et billett er knyttet til én visning. Attributtet rabattkode er NULL hvis ingen rabatt er brukt.
Skriv ut det totale antallet visninger kinoen med navn 'Filmpalasset' har i juni 2026. Hvilken spørring er riktig?
Skriv ut tittel, dato og tidspunkt for alle visninger av filmer med sjanger = 'komedie' som har solgt mer enn 50 billetter, sortert på dato stigende.
Finn tittel på alle filmer som ikke har noen visninger registrert i databasen.
Lag et VIEW kalt POPULAERE_FILMER som viser film_id, tittel og totalt antall solgte billetter for alle filmer som har solgt mer enn 100 billetter totalt på tvers av alle visninger.
Du vil finne saler som har kapasitet til minst 100 seter, men der ingen billetter er solgt til noen visning i den salen. Hvilken tilnærming er riktig?
Tabellen BILLETT har attributtet rabattkode som kan inneholde ulike typer rabattdata – noen billetter har en tekstkode, andre har en prosentsats, andre har ingen rabatt (NULL). En utvikler foreslår å erstatte rabattkode med en JSON-kolonne rabatt_info som kan inneholde varierende struktur per rad. Hva er den viktigste fordelen med dette?
Er tabellen VISNING normalisert til og med 3NF? Gi en kort tekstlig begrunnelse med eventuelle antagelser.
En billettkjøp-transaksjon gjør følgende: (1) sjekker at setet ikke er opptatt, (2) setter inn en ny rad i BILLETT. Systemet krasjer mellom steg 1 og 2. Hvilken ACID-egenskap sikrer at ingen halv transaksjon ligger igjen i databasen?
To brukere prøver å kjøpe siste ledige sete (sete_nr 14) på samme visning samtidig. Transaksjon T1 leser at sete 14 er ledig. Transaksjon T2 leser at sete 14 er ledig. T1 kjøper setet og committer. T2 kjøper også setet og committer – nå er setet dobbeltsolgt. Hvilket problem er dette et eksempel på?
Når du er ferdig, klikk «Lever eksamen» for å se fasit og riktige svar på flervalgsspørsmålene.
SJANGER: sjangerNavn er naturlig PK (forutsatt unike sjangernavnavn). Alternativt surrogat-id sjanger_id.
BOK: Surrogat-id bok_id anbefales – tittel er ikke unik (samme tittel kan gis ut flere ganger).
FORFATTER: Surrogat-id forfatter_id – navn er ikke unik.
UTLÅN: Surrogat-id utlan_id. Alternativt sammensatt av bok_id* + medlem_id* + utlånsdato, men surrogat er enklere.
MEDLEM: Surrogat-id medlem_id, eller epost hvis den garanteres unik.
BOK_FORFATTER er koblingstabellen for M:N-relasjonen mellom BOK og FORFATTER. UTLÅN kobler BOK og MEDLEM – en M:N med egne attributter.
En mange-til-mange-relasjon oversettes alltid med en koblingstabell. BOK_FORFATTER(bok_id*, forfatter_id*) med sammensatt PK er den korrekte løsningen. Alternativ A bryter 1NF (liste i én celle).
Legg til en koblingstabell for M:N-relasjonen mellom MEDLEM og SJANGER:
Ingen endringer i eksisterende tabeller er nødvendig – bare legg til den nye koblingstabellen.
dato og kino-navn ligger i ulike tabeller – du må joine VISNING → SAL → KINO. Alternativ A feiler fordi navn ikke finnes i VISNING.
Billetter er ikke direkte knyttet til SAL – du må gå SAL → VISNING → BILLETT. Alternativ A er feil fordi BILLETT ikke har sal_id direkte. Alternativ D finner saler uten visninger, ikke saler uten billetter – det er ikke det samme.
Fordelen med JSON her er fleksibel struktur per rad – noen rader kan ha {type: "prosentkode", verdi: 15}, andre {type: "kampanjekode", kode: "SOMMER26"}, uten å endre tabellskjemaet. Ulemper: vanskeligere å søke på, ingen RI for innholdet.
Ja, VISNING(visning_id, film_id*, sal_id*, dato, tidspunkt, pris) er i 3NF. PK er visning_id. Alle andre attributter (film_id, sal_id, dato, tidspunkt, pris) er direkte avhengige av visning_id – ingen er avhengig av et annet ikke-nøkkelattributt. Det finnes ingen transitiv avhengighet.
Merk: Man kan diskutere om pris avhenger av sal eller film, men slik tabellen er definert antas pris å være en egenskap ved akkurat denne visningen.
Atomicity = alt eller ingenting. Krasjer systemet midt i en transaksjon, rulles alle deloperasjoner tilbake. Ingen halv INSERT blir igjen.
Dette er et lost update-problem: begge leste samme tilstand (sete ledig), begge skrev basert på den tilstanden, og T1s endring ble overskrevet av T2. Dirty read ville vært hvis T2 leste en ucommittet endring. Non-repeatable read ville vært hvis T2 leste setet på nytt og fikk en annen verdi.