Eksempler på hva man kan bruke SQL til:
Lagringsplass for databasen til Hobbyhuset?
For å svare på denne oppgaven tar vi utgangspunkt i tabelldefinisjonene i vedlegg B. Basert på datatypene til kolonnene kan vi regne ut plassbehovet for én enkelt rad. Deretter anslår vi antall rader i hver tabell for å beregne samlet plassbehov for databasen.
Vi må først finne plassbehovet for enkeltverdier i ulike datatyper. Vi tar utgangspunkt i dokumentasjonen for MySQL, og setter opp følgende forenklede tabell for de datatypene som brukes i Hobbyhuset:
Datatype | Antall byter |
---|---|
SMALLINT | 2 |
INTEGER | 4 |
CHAR(n) | n |
VARCHAR(n) | n+1 |
DECIMAL(8,2) | 8 |
DATE | 3 |
Vi antar her at hvert tegn lagret som tekst krever 1 byte. Dette avhenger av hvilke tegnsett som er valgt. Hvis slike data lagres som Unicode vil hvert tegn kreve minst 2 byter, og noen tegn som mye som 4 byter.
Plassbehovet for verdier i datatypen DECIMAL(p,s) avhenger av totalt antall siffer p og antall plasser etter desimalpunktum s. I Hobbyhuset blir denne datatypen kun brukt for å lagre beløp og da hele veien som DECIMAL(8, 2). Vi går ikke nærmere inn på hvordan plassbehovet for denne datatypen er generelt, og antar bare at DECIMAL(8, 2) krever 8 byter.
Vi antar videre at data blir lagret "tett", ved at vi multipliserer plassbehovet for én rad med anslått antall rader for å finne plassbehovet for en tabell. Dette er ikke realistisk – forklaring følger i kapittel 9.
Tabell | Antall rader | Byter pr. rad | Plassbehov |
---|---|---|---|
Poststed | 4 000 | 4 + 51 = 55 | 220 000 |
Ansatt | 50 | 2 + 51 + 51 + 101 + 4 + 3 + 1 + 51 + 8 = 272 | 13 600 |
Kategori | 30 | 2 + 51 = 53 | 1 590 |
Kunde | 500 | 4 + 51 + 51 + 101 + 4 = 211 | 105 500 |
Vare | 2 000 | 5 + 51 + 8 + 2 + 4 + 3 = 73 | 146 000 |
Prishistorikk | 10 000 | 5 + 3 + 8 = 16 | 160 000 |
Ordre | 5 000 | 4 + 3 + 3 + 3 + 4 = 17 | 85 000 |
Ordrelinje | 20 000 | 4 + 5 + 8 + 4 = 21 | 420 000 |
Totalt | 1 151 690 |
Totalt vil databasen dermed kreve ca. 1 151 690 byter ≈ 1.2 MB.
Eksempeltabeller for universitetsdatabase.
Også på denne oppgaven er det mange mulige svar. Løsningen under fokuserer på ansatte, studenter og kurs, men et universitet må også lagre mange andre typer av informasjon. Vi nøyer oss med noen få eksempelrader for hver tabell.
Merk hvordan visse verdier går igjen i flere tabeller, f.eks. finner vi igjen både studentnumre og kurskoder i tabellen Karakter. Dette gjøres for at tabellene skal henge logisk sammen.
AnsNr | Fornavn | Etternavn | Stilling |
---|---|---|---|
20 | Knuth | Ullmann | Professor |
21 | Martin | Abel | Amanuensis |
22 | Lise | Fahrenheit | Professor |
23 | Celcius | Morgenstierne | Universitetslektor |
StudKode | Navn | Studiepoeng |
---|---|---|
701902 | Sivilingeniør IKT | 300 |
701933 | Bachelor sykepleie | 180 |
701055 | Bachelor friluftsliv | 180 |
KursKode | Navn | Studiepoeng |
---|---|---|
INF208 | Databaser II | 15 |
MAT001 | Matematikk | 10 |
INF001 | Grunnkurs IKT | 10 |
INF230 | Objektorientert systemutvikling | 10 |
INF382 | Automatateori | 10 |
INF399 | Parallellprogrammering | 10 |
StudKode | KursKode | Årstrinn | Semester |
---|---|---|---|
701902 | MAT001 | 1 | H |
701902 | INF208 | 4 | V |
701933 | MAT001 | 1 | H |
StudNr | Fornavn | Etternavn | Adresse | PostNr |
---|---|---|---|---|
19201 | Per | Zachariassen | Bjerggata 2 | 3400 |
19217 | Karianne | Brandt | Lovisenbergveien 17 | 3200 |
19333 | Birgitte | Lorentzen | Bergenveien 237 | 3200 |
StudNr | KursKode | Dato | Karakter |
---|---|---|---|
19201 | MAT001 | 10.12.2019 | C |
19201 | INF208 | 04.05.2020 | B |
19333 | MAT001 | 08.06.2020 | D |
Oversett 10000111 fra totallsystemet til titallsystemet.
1 × 27 + 0 × 26 +
0 × 25 + 0 × 24 +
0 × 23 + 1 × 22 +
1 × 21 + 1 × 20
= 128 + 0 + 0 + 0 + 0 + 4 + 2 + 1
= 135
Oversett 204 fra titallsystemet til totallsystemet.
Boken gir ingen oppskrift på hvordan man går fram, så her måtte man enten slå opp i en gammel matte-bok, søke på nettet, eller tenke ut en framgangsmåte selv.
Framgangsmåte: Heltallsdivider tallet på 2 og sjekk om det gir (1 til) rest. I så fall skal siste siffer være 1, og ellers 0. Fortsett på samme måte med toerplassen, firerplassen, åtterplassen osv., helt til resultatet av divisjonen blir 0.
Titallsystemet | Resultat | Rest | Totallsystemet |
---|---|---|---|
204 / 2 | 102 | 0 | 0 |
102 / 2 | 51 | 0 | 00 |
51 / 2 | 25 | 1 | 100 |
25 / 2 | 12 | 1 | 1100 |
12 / 2 | 6 | 0 | 01100 |
6 / 2 | 3 | 0 | 001100 |
3 / 2 | 1 | 1 | 1001100 |
1 / 2 | 0 | 1 | 11001100 |
0 |
204 i titallsystemet blir altså 11001100 i totallsystemet, som vi kan dobbeltsjekke ved å oversette tilbake: 128 + 64 + 8 + 4 = 204.
Meningen med denne oppgaven var at man skulle finne fram til representasjonen av egen e-postadresse i form av Unicode tallkoder.
Min adresse er bjorn.kristoffersen@usn.no og det gir følgende tallsekvens:
98 106 111 114 110 46 107 114 105 115 116 111 102 102 101 114 115 101 110 40 117 115 110 46 110 111
Her er f.eks. 46 tallkoden til punktum og 40 tallkoden til @.
Hvordan blir data representert i en relasjonsdatabase?
I en relasjonsdatabase blir alle data lagret i tabeller. Ordet relasjon er hentet fra matematikk og, som vi skal se i kapittel 6, er i en viss forstand det samme som en tabell. Slik sett kan man kalle relasjonsdatabaser for "tabelldatabaser".
Noen av oppgavene til et databasehåndteringssystem:
Hvilke egenskaper gjelder?
Personene til venstre for venstre hånd er sortert alfabetisk, og de er alle alfabetisk mindre enn resten.
Maksimalt antall ombyttinger?
Hvis rekken er sortert synkende (omvendt sortert) blir det bytter for hver eneste sammenligning. Følgende viser første "gjennomløp" med høyre hånd for en rekke med fire tall (venstre hånd peker på plass 1 hele tiden):
8 - 5 - 4 - 2
5 - 8 - 4 - 2
4 - 8 - 5 - 2
2 - 8 - 5 - 4
Når N=4 får vi altså N-1=3 bytter for å få på plass det minste tallet i plass 1. Merk at tallene fra og med posisjon 2 er omvendt sortert (5 - 4 - 2). Deretter må vi bruke N-2=2 bytter for å få riktig tall i plass 2, og N-3=1 bytter for å få riktig tall i plass 3. Det siste tallet er da nødvendigvis også korrekt plassert. Det betyr (N-1) + (N-2) + ... + 1 = N ×(N-1)/2 bytter. Dette er for øvrig en meget ineffektiv sorteringsalgoritme.