IDATT2002 – Normalisering, ACID, Transaksjoner, NoSQL, JSON
Tre regler du sjekker i rekkefølge. Hver form bygger på den forrige.
Atomisk betyr "ikke delbar" – én verdi per celle, ikke en liste eller flere ting pakket sammen.
Alle verdier er atomiske. Ingen repeterende grupper.
En PK som består av to eller flere kolonner i kombinasjon. Verken kolonne A eller B er unik alene – men kombinasjonen er det.
Kun relevant når PK er sammensatt. Alle attributter må avhenge av hele PK, ikke bare en del.
A → B → C, der A er PK og B er ikke-nøkkel. C avhenger av A, men bare gjennom B – ikke direkte.
Ingen ikke-nøkkel-attributt skal avhenge av et annet ikke-nøkkel-attributt.
Still deg disse spørsmålene i rekkefølge:
Fire egenskaper som garanterer pålitelige transaksjoner. Gjelder alle relasjonsdatabaser (MySQL, PostgreSQL, MariaDB). Du trenger ikke gjøre noe spesielt – databasen håndterer det i bakgrunnen.
| Bokstav | Navn | Betyr |
|---|---|---|
| A | Atomicity | Alt eller ingenting. Krasjer det midt i → alt rulles tilbake (ROLLBACK) |
| C | Consistency | Databasen går alltid fra én gyldig tilstand til en annen. Alle regler overholdes |
| I | Isolation | Samtidige transaksjoner forstyrrer ikke hverandre. Styres med isolasjonsnivå |
| D | Durability | Committed data overlever krasj og strømbrudd – skrevet til disk |
Oppstår kun ved samtidig bruk av databasen – mange brukere/prosesser på samme tid. Isolation i ACID er det som beskytter mot dem, styrt av isolasjonsnivå.
| Problem | Hva skjer | Nøkkelord |
|---|---|---|
| Dirty read | T1 leser data T2 har endret men ikke committert. T2 gjør ROLLBACK – T1 har lest data som aldri eksisterte | Leste ucommittet data |
| Non-repeatable read | T1 leser en rad. T2 endrer og committer. T1 leser samme rad igjen og får en annen verdi | Samme rad, ulik verdi |
| Phantom read | T1 kjører en spørring og får N rader. T2 setter inn nye rader. T1 kjører samme spørring og får N+M rader | Samme spørring, flere rader |
| Lost update | T1 og T2 leser begge samme verdi. Begge skriver basert på den. T2s commit overskriver T1s endring | Begge leste samme, én forsvant |
| Deadlock | T1 venter på T2s lås. T2 venter på T1s lås. Ingen kan fortsette. Databasen velger én som offer og ruller den tilbake | Begge venter på hverandre |
| Problem | Løses med |
|---|---|
| Dirty read | ✅ Isolasjonsnivå (READ COMMITTED eller høyere) |
| Non-repeatable read | ✅ Isolasjonsnivå (REPEATABLE READ eller høyere) |
| Phantom read | ✅ Isolasjonsnivå (SERIALIZABLE) |
| Lost update | ⚠️ Delvis isolasjonsnivå – best løst med eksplisitt låsing (SELECT ... FOR UPDATE) |
| Deadlock | ❌ Ikke isolasjonsnivå – databasen oppdager og ruller én transaksjon tilbake automatisk |
NoSQL = "Not only SQL". Databaser som ikke bruker relasjonsmodellen. Fire hovedtyper:
| Type | Eksempel | Brukes til |
|---|---|---|
| Dokumentdatabase | MongoDB | Fleksible JSON-dokumenter der struktur varierer mellom rader |
| Nøkkel-verdi | Redis | Lynrask oppslag på nøkkel – caching, sesjoner |
| Graf | Neo4j | Relasjoner mellom noder – sosiale nettverk, anbefalinger |
| Kolonnebasert | Cassandra | Enorme datamengder – logg, sensordata |
| SQL | NoSQL | |
|---|---|---|
| Skjema | Fast, definert på forhånd | Fleksibelt, varierer per rad |
| Skalering | Vertikalt (kraftigere server) | Horisontalt (flere servere) |
| Konsistens | Sterk (ACID) | Ofte svakere |
| Passer til | Bank, HR, ordre – strukturert data | Logg, sosiale medier, sensorer |
Lagre semi-strukturert data direkte i én kolonne. Nyttig når strukturen varierer mellom rader.
| Fordeler | Ulemper |
|---|---|
| Fleksibel struktur per rad | Vanskelig å søke på enkeltfelt |
| Slipper å endre tabellskjema | Ingen referanseintegritet for innholdet |
| Bra når data leses samlet | Bryter med normalisering |