dbsys.info

Løsningsforslag til kapittel 15

Oppgave 1

Objektrelasjonelle PostgreSQL-datatyper i Hobbyhuset.

Både Kunde og Ansatt inneholder kolonner Fornavn og Etternavn. Disse lar seg representere som et sammensatt navn ved en brukerdefinert datatype:


CREATE TYPE NavnType AS
(
  Fornavn    VARCHAR(50) NOT NULL,
  Etternavn  VARCHAR(50) NOT NULL,
);

En skisse av hvordan denne datatypen kan brukes i definisjonen av tabellen Kunde:


CREATE TABLE Kunde
(
  ...
  Navn  NavnType,
  ...
);

I løsningsforslag til oppgave 1e blir fornavn og etternavn til hver kunde vist. SELECT-delen må da skrives om som følger:


SELECT K.KNr, (Navn).Fornavn, (Navn).Etternavn, ...

Ved å innføre en brukerdefinert datatype for detaljene på en ordre, kan vi samle alle opplysninger om én ordre på én rad.


CREATE TYPE OrdrelinjeType AS
(
  VNr         CHAR(5),
  PrisPrEnhet DECIMAL(8,2) NOT NULL,
  Antall      INTEGER NOT NULL,
)

Tabellen Ordre kan deretter bygges ut med en array-kolonne Linjer:


CREATE TABLE Ordre
(
  OrdreNr    INTEGER,
  OrdreDato  DATE NOT NULL,
  SendtDato  DATE,
  BetaltDato DATE,
  KNr        INTEGER NOT NULL,
  Linjer[]   OrdrelinjeType[],
  CONSTRAINT OrdrePN PRIMARY KEY (OrdreNr),
  CONSTRAINT OrdreKundeFN FOREIGN KEY (KNr) REFERENCES Kunde (KNr)
);

Det gjenstår å omprogrammere noen av spørringene i kapittel 4. Her er først et enkelt eksempel på hvordan man kan hente ut ordrelinjer – spørringen viser første ordrelinje på hver ordre:


SELECT OrdreNr, OrdreDato, KNr, Linjer[0]
FROM Ordre

PostgreSQL-funksjonen UNNEST kan brukes for å "ekspandere" en array. Neste spørring leverer det samme som en indre likekobling mellom Ordre og Ordrelinje i den "vanlige" utgaven av Hobbyhuset.


SELECT OrdreNr, OrdreDato, KNr, UNNEST(Linjer)
FROM Ordre;

Kolonnen Kunde.Kjønn kan håndteres som en oppramstype:


CREATE TYPE KjønnType AS ENUM ('mann', 'kvinne');

Oppgave 2

Fjelltopper, elver og kommuner.

Vi kan her lage en tabell for fjelltopper, en for elver og en for kommuner. Tabellene kan inneholde "vanlige" egenskapsdata, som f.eks. navn, og dessuten geometridata (koordinater) i en egen kolonne Geometri med datatype Geography – dette forutsetter PostgreSQL-utvidelsen PostGIS. For en fjelltopp vil Geometri-kolonnen være et punkt, for en elv vil kolonnen være en polylinje og for en kommune vil kolonnen være et polygon. Verdier i datatypen Geometry knyttes for øvrig til et såkalt referansesystem, les mer om dette i dokumentasjonen for PostGIS.


CREATE TABLE Fjelltopp
(
  Id INTEGER,
  HøydeOverHavet INTEGER,
  Geometri GEOMETRY,
  PRIMARY KEY (Id)
);

CREATE TABLE Elv
(
  Id INTEGER,
  Navn VARCHAR(100),
  Geometri GEOMETRY,
  PRIMARY KEY (Id)
);

CREATE TABLE Kommune
(
  Id INTEGER,
  KommuneNr VARCHAR(4),
  Navn VARCHAR(100),
  Geometri GEOMETRY,
  PRIMARY KEY (Id)
);

Oppgave 3

Studieomtaler i MongoDB.

Innholdet på XML-filen laget til oppgave 1 i kapittel 14 lar seg oversette relativt direkte til JSON. XML-elementer med flere forskjellige "barn" blir til JSON-objekter, mens XML-elementer med et antall barn av samme "type" blir håndtert ved JSON-arrays. BSON er en "binærversjon" av JSON og det finnes verktøy som konverterer fra JSON til BSON. Metodene i JSON-API'et til MongoDB kan kalles med JSON-verdier, men data blir lagret på BSON-format.

Et forslag til JSON-fil: studiehandbok.json

Oppgave 4

MongoDB dokumentdatabase for golfapplikasjon.

Det virker naturlig å lage følgende dokumentsamlinger:

Utdrag av eksempeldata for en golfrunde:


{
  "RundeNr": 173,
  "Dato": "2024-05-16",
  "BaneNr": 23,
  "Resultater":
  [
    {
      "SpillerNr": 562,
      "HullNr": 1,
      "AntallSlag": 5
    },
    {
      "SpillerNr": 287,
      "HullNr": 1,
      "AntallSlag": 4
    }
  ]
}

Oppgave 5

JavaScript-spørringer mot golfdatabasen i oppgave 4.

Løsningsforslag er ikke laget ennå.

Oppgave 6+7

Det er ikke laget løsningsforslag til KI-oppgavene (oppgaveteksten beskriver hva man skal gjøre).