Introduksjon til databaser
Hva er en database, hvorfor trenger vi et DBMS, og hvilke deler av systemet sørger for at det hele fungerer — uten at applikasjonen må tenke på det.
Hva er en database
En database er en samling sammenhengende data som beskriver en virksomhet — kunder og kontoer i en bank, studenter og emner ved et universitet, brukere og innlegg på et sosialt nettverk. Et databasebehandlingssystem (DBMS) er et programvarelag som lar mange brukere lagre, oppdatere og hente disse dataene samtidig, effektivt, og uten å miste dem.
Tre kjennetegn på data som hører hjemme i en database
- Verdifulle — virksomheten kan ikke fungere uten dem.
- Store — vesentlig større enn det som får plass i hovedminnet.
- Delte — flere brukere og applikasjoner aksesserer dem samtidig.
Hvor møter du databaser?
OLTP (online transaction processing) — mange brukere, hver henter/oppdaterer små datamengder. Bank, butikk, registrering. Dette er hovedfokus i dette kurset.
OLAP / data analytics — færre brukere, hver leser store datamengder for å oppdage mønstre og lage prediksjoner. Lånevurdering, anbefalingsmotor, business intelligence. Dekkes kort i F10.
Hvorfor ikke bare bruke filer
Før relasjonsdatabasenes inntog ble bedrifter drevet av hjemmesnekrede filbasert systemer: Hvert program leste og skrev sine egne filer i sitt eget format. Det fungerer for små problemer. Det havarerer i stor skala — av seks bestemte grunner.
1. Redundans og inkonsistens
Samme student lagres både i musikk-instituttets fil og i matematikk-instituttets fil. Endrer hun adresse, oppdateres bare den ene. Nå er adressen feil — i én av filene.
2. Vanskelig dataaksess
«Finn alle studenter i postnummer 7491 som har tatt over 60 studiepoeng» — finnes det ikke et program for, så må noen skrive ett. Hvert nytt spørsmål krever ny kode.
3. Dataisolering
Data er spredt over filer i ulike formater. Å samle dem i én rapport krever mye lim-kode.
4. Integritetsproblemer
Regelen «kontosaldoen kan ikke gå under null» må kodes inn i hvert eneste program som rører saldoen. Glemmer ett program det, brytes regelen.
5. Atomicity-problemer
Pengeoverføring er to skritt: trekk fra A, legg til B. Hvis maskinen krasjer mellom dem, er pengene borte. Et filsystem har ingen «alt-eller-ingenting».
6. Samtidighetsanomalier
To kasserere trekker fra samme konto samtidig. Begge leser saldoen først, regner uavhengig, og overskriver hverandre. Pengene «forsvinner». Se simulator under.
7. Sikkerhetsproblemer
Ikke alle skal se alt. I et fil-system er tilgangskontroll ad hoc og lett å glemme. DBMS-en sentraliserer det.
Lost update — en konkret race condition
Konto A har 10 000 kr. To kasserere skal samtidig trekke fra: kasserer T₁ skal ta 500 kr, T₂ skal ta 100 kr. Riktig svar er 9 400 kr. Klikk gjennom for å se hva som faktisk kan skje.
Begge kasserererne tror de har gjort jobben riktig. Men siden T₂ leste saldoen før T₁ rakk å skrive, baserer T₂ seg på en utdatert verdi. Bankens 500 kr forsvinner i tynn luft. DBMS-en løser dette med transaksjoner og låser (Kap. 8).
Hva er en datamodell
En datamodell er et begrepsapparat for å beskrive data, sammenhengene mellom dem, og hvilke regler som må gjelde. Modellen gir oss et språk å snakke om data i, uavhengig av lagringsdetaljer.
Relasjonsmodellen — tabeller med navngitte kolonner
Edgar Codd, 1970. Data lagres som relasjoner (tabeller) med faste kolonner. Hver rad er én oppføring. Sammenhenger uttrykkes ved at en kolonne i én tabell refererer til en kolonne i en annen.
instructor department
+-------+------------+----------+ +-----------+----------+--------+
| ID | name | dept | | dept | building | budget |
+-------+------------+----------+ +-----------+----------+--------+
| 22222 | Einstein | Physics | | Physics | Watson | 70000 |
| 76766 | Crick | Biology | | Biology | Watson | 90000 |
| 10101 | Srinivasan | Comp.Sci.| | Comp.Sci. | Taylor | 100000 |
+-------+------------+----------+ +-----------+----------+--------+
Dominerende modell i dag. Hele Del 1 av kurset handler om denne. Detaljer: Kap. 2.
ER-modellen — bokser, romber, linjer
Brukes til design, ikke til lagring. Entiteter er ting (Student, Emne), relasjoner er sammenhenger (Student tar Emne). Tegnes som diagram, oversettes deretter til tabeller. Detaljer: Kap. 4.
┌──────────┐ ┌────────┐ ┌──────┐
│ Student │────◇────│ tar │────◇────│ Emne │
└──────────┘ └────────┘ └──────┘
Semi-strukturerte data — JSON, XML
Hver post kan ha sitt eget sett med attributter. Bra for løs struktur, vanskelig for konsistente spørringer. Eksempel:
{ "id": 22222, "name": "Einstein", "dept": "Physics" }
{ "id": 76766, "name": "Crick",
"dept": "Biology", "office": "Watson 305",
"publications": ["dna-1953", "..."] }
Objekt-basert
Inspirert av OOP. Klasser, arv, metoder lagret i databasen. I dag stort sett integrert som «object-relational» utvidelser av relasjonsdatabaser snarere enn som egen modell.
Lag av abstraksjon
Et DBMS skjuler implementasjonsdetaljer. Bruker som kjører en SQL-spørring trenger ikke vite at radene ligger som komprimerte byte i 8 KB-blokker på en SSD, eller at det finnes en B+-tre-indeks som gjør oppslaget raskt. Denne separasjonen organiseres i tre lag.
Visningsnivå — hva brukeren får se
Skreddersydd delmengde av databasen. Sekretæren ser ikke lønninger; lønningsavdelingen ser ikke karakterer. Flere visninger over samme logiske skjema.
Logisk nivå — hva som lagres og hvordan det henger sammen
Tabeller, kolonner, fremmednøkler, integritetskrav. Programmerernes hverdag. SQL opererer her. DBA-en designer dette nivået.
Fysisk nivå — hvordan det virkelig ligger på disk
Heap-filer, blokkstørrelser, indekser, kompresjon, plassering på SSD/HDD. Skjult bak det logiske skjemaet.
Fysisk dataindependence — hvis du bytter ut en heap-fil med en B+-tre-organisert fil for å gjøre range-spørringer raskere, skal ingenting på det logiske nivået trenge å endres. Applikasjonen merker det ikke (utover at den blir raskere).
instructor.dept_name. Hvilket lag endres, og hvilke applikasjoner må skrives om?Skjema og instans
Skjemaet er designet — strukturen, typene, reglene. Det er som typedeklarasjonene i et program. Instansen er innholdet i øyeblikket — det som ligger i tabellene akkurat nå. Den endres for hver INSERT, UPDATE, DELETE; skjemaet endres knapt.
CREATE TABLE instructor (
ID CHAR(5) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
dept_name VARCHAR(20),
salary NUMERIC(8, 2)
);
22222 Einstein Physics 95000
12121 Wu Finance 90000
10101 Srinivasan Comp.Sci. 65000
...
22222 Einstein Physics 95000
12121 Wu Finance 90000
10101 Srinivasan Comp.Sci. 65000
99999 Hopper Comp.Sci. 88000 ← ny
...
Analogi: I et Java-program er class Instructor { ... } skjemaet, og den faktiske List<Instructor> i minnet er instansen — samme kode, ulik tilstand fra øyeblikk til øyeblikk.
instructor. Hva endres — skjemaet, instansen, eller begge?ALTER TABLE.Databasespråk
SQL er to språk i ett. DDL (Data Definition Language) brukes til å definere skjemaet — CREATE, ALTER, DROP. DML (Data Manipulation Language) brukes til å lese og endre data — SELECT, INSERT, UPDATE, DELETE.
DDL — definere strukturen
CREATE TABLE department (
dept_name VARCHAR(20) PRIMARY KEY,
building VARCHAR(15),
budget NUMERIC(12, 2) CHECK (budget >= 0)
);
ALTER TABLE instructor
ADD CONSTRAINT fk_dept
FOREIGN KEY (dept_name) REFERENCES department(dept_name);
DDL-utdata legges i data dictionary — en intern tabell med metadata om alle tabeller, kolonner, og constraints. DBMS-en konsulterer denne før hver eneste spørring.
DML — manipulere innholdet
SELECT instructor.name
FROM instructor
WHERE instructor.dept_name = 'History';
Resultatet er en ny tabell med én kolonne (name) og radene til alle historikere. SQL er deklarativt: vi sier hva vi vil ha, ikke hvordan den skal hentes. Optimizeren velger plan.
Prosedurelt: «Åpne fila, gå til posisjon 0, les 1024 byte, finn kolonne dept, sammenlign med 'History', skriv ut name, gjenta…». Brukeren forteller hvordan.
Deklarativt (SQL): «Gi meg navnet på instruktørene i historie». Brukeren forteller hva. DBMS-en velger den effektive planen — og kan velge en annen plan i morgen, hvis dataene har endret seg.
Integritetskrav som DDL kan uttrykke
- Domenekrav — kolonnen er
NUMERIC(8,2), kan ikke inneholde tekst. - Referansiell integritet —
instructor.dept_namemå finnes idepartment.dept_name. - Autorisasjon — hvem får read, insert, update, delete?
Fire bokstaver, fire garantier
En transaksjon er en logisk arbeidsenhet — én eller flere SQL-setninger som hører sammen. DBMS-en garanterer fire egenskaper for enhver transaksjon. Klikk en bokstav for detaljer.
Atomicity — alt eller ingenting
Hver transaksjon er udelelig. Enten utføres alle skritt, eller ingen. Hvis maskinen krasjer halvveis, ryddes det halvutførte vekk under recovery.
Recovery-manager (Kap. 8) sørger for atomicity og durability ved å skrive en logg-post for hver endring før selve datasiden flushes. Concurrency-control-manager sørger for isolation ved bruk av låser eller multiversioning.
Databasemotorens komponenter
Et DBMS er ikke ett program — det er et knippe samarbeidende moduler. Tre hovedkomponenter: query processor (forstår SQL), storage manager (snakker med disk), og transaction manager (lover ACID).
Hva gjør hver komponent?
- DDL-interpreter — leser
CREATE TABLEosv. og legger metadata i datakatalogen. - DML-kompilator — oversetter SQL til en kostnadsbasert spørreplan; gjør spørringsoptimalisering.
- Query evaluation engine — kjører planen; ber storage manager om data og lar transaction manager gjøre gjeldende.
- Buffer manager — holder de heteste blokkene i RAM så de ikke må leses fra disk hver gang.
- File manager — vet hvilke blokker som er ledige, hvor radene ligger, hvilke indekser som peker hvor.
- Concurrency control — sørger for at parallelle transaksjoner ikke ødelegger for hverandre.
- Recovery manager — skriver logg, ruller tilbake aborterte transaksjoner, gjenoppretter etter krasj.
To-tier vs. tre-tier
Når en applikasjon snakker med databasen, kan den enten gjøre det direkte fra klienten (to-tier) eller gå via en applikasjonsserver (tre-tier). Moderne web- og mobil-applikasjoner er nesten alltid tre-tier.
To-tier
Tre-tier
Sentralisert, parallell, distribuert
- Sentralisert — én maskin, eventuelt med flere CPU-er som deler minne.
- Parallell — en klynge av maskiner samarbeider om en database for å håndtere store volum.
- Distribuert — data ligger geografisk spredd på flere maskiner.
Hvem bruker en database
Databasesystemenes historie
Det er nyttig å se hvor relasjonsmodellen kom fra — og hva som finnes ved siden av den i dag.
Test deg selv
Et siste sett spørsmål som dekker hele kapittelet — fra terminologi til hvorfor-spørsmål.
order(customer_id). Tabellens skjema er uendret, eksisterende SQL fortsetter å virke uten endring; optimizeren bruker bare indeksen når den hjelper. Applikasjonen merker ingenting — annet enn at noen spørringer går raskere.class Person { String name; int age; } er skjemaet; den konkrete List<Person> i minnet med Ada og Linus er instansen. Skjemaet endres sjelden, instansen endres for hver INSERT/UPDATE/DELETE.Når du synes disse spørsmålene sitter, er du klar for Kapittel 2 — Relasjonsmodellen.