Tilbake
5.4
NoSQL og alternative datalagring

5.4 NoSQL og alternative datalagring

Dokumentdatabaser, nøkkel-verdi-lagring og grafbaser.

60 min
6 oppgaver
NoSQLMongoDBDokumentdatabaseNøkkel-verdi
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 6 oppgaver

NoSQL og alternative datalagring

Relasjonsdatabaser er fantastiske for strukturerte data med klare relasjoner. Men hva når dataene dine ikke passer i tabeller? Hva hvis du trenger ekstrem skalerbarhet eller fleksibilitet?

Da kan NoSQL-databaser være løsningen.

I dette kapittelet lærer du:
- Hva NoSQL er og hvorfor det eksisterer
- Ulike typer NoSQL-databaser
- MongoDB som eksempel på dokumentdatabase
- Når bruke SQL vs. NoSQL

Hva er NoSQL?

NoSQL står for "Not Only SQL" (ikke bare SQL). Det er et samlebegrep for databaser som ikke følger den tradisjonelle relasjonsdatabasemodellen.

Hvorfor NoSQL?

Relasjonsdatabaser har utfordringer med:
- Skalerbarhet: Vanskelig å spre data over mange servere
- Fleksibilitet: Krever fast skjema (schema) på forhånd
- Ytelse: JOIN-operasjoner kan bli trege på store datasett

NoSQL-databaser er designet for:
- Horizontal skalering: Spre data over mange servere
- Skjemafrihet: Endre struktur underveis uten å migrere hele databasen
- Spesialiserte bruksområder: Optimalisert for spesifikke typer data

Typer NoSQL-databaser

1. Dokumentdatabaser (MongoDB, CouchDB)
- Lagrer data som dokumenter (vanligvis JSON)
- Eksempel: Blogginlegg med kommentarer

2. Nøkkel-verdi-lagring (Redis, DynamoDB)
- Enkel lagring av nøkkel → verdi
- Eksempel: Sessions, cache

3. Kolonneorienterte (Cassandra, HBase)
- Optimalisert for store datasett med mange kolonner
- Eksempel: Tidsseriedata, loggfiler

4. Grafdatabaser (Neo4j, ArangoDB)
- Optimalisert for data med mange relasjoner
- Eksempel: Sosiale nettverk, anbefalingssystemer

Dokumentdatabaser

Den mest populære typen NoSQL. Data lagres som dokumenter (vanligvis JSON eller BSON).

Eksempel: MongoDB-dokument

{
  "_id": "507f1f77bcf86cd799439011",
  "navn": "Ole Olsen",
  "epost": "ole@example.com",
  "adresse": {
    "gate": "Storgata 1",
    "postnummer": "0001",
    "by": "Oslo"
  },
  "interesser": ["programmering", "gaming", "fotball"],
  "registrert": "2024-01-15"
}

Fordeler:
- Nestede strukturer (adresse inne i bruker)
- Arrays (interesser) uten egen tabell
- Fleksibelt skjema (ett dokument kan ha felt andre mangler)

Ulemper:
- Kan føre til dataredundans
- Mindre støtte for komplekse spørringer over relasjoner
- Ingen garantert ACID-egenskaper (avhengig av database)

MongoDB-konsepter

MongoDB er den mest populære dokumentdatabasen.

Terminologi (SQL → MongoDB)

SQLMongoDB
DatabaseDatabase
TabellCollection
RadDocument
KolonneField
JOINEmbedded docs / $lookup

Grunnleggende operasjoner (pseudo-kode)


Create:
db.users.insertOne({
  navn: "Kari Hansen",
  epost: "kari@example.com",
  alder: 25
})
Read:
// Finn alle over 18 år
db.users.find({ alder: { $gt: 18 } })

// Finn én bruker
db.users.findOne({ epost: "kari@example.com" })
Update:

db.users.updateOne(
  { epost: "kari@example.com" },
  { $set: { alder: 26 } }
)

Delete:

db.users.deleteOne({ epost: "kari@example.com" })

Nestede strukturer


{
  "tittel": "Min blogg",
  "innhold": "Dette er en bloggpost...",
  "forfatter": {
    "navn": "Ole",
    "epost": "ole@example.com"
  },
  "kommentarer": [
    {
      "bruker": "Kari",
      "tekst": "Bra innlegg!",
      "dato": "2024-01-15"
    },
    {
      "bruker": "Per",
      "tekst": "Enig!",
      "dato": "2024-01-16"
    }
  ]
}

Dette ville krevd 3 tabeller i SQL (Blogg, Forfatter, Kommentar).

Nøkkel-verdi-lagring

Den enkleste formen for NoSQL. Fungerer som en gigantisk Python-dictionary.

Eksempel: Redis

# Lagre verdi
redis.set("bruker:1001:navn", "Ole Olsen")
redis.set("bruker:1001:poeng", 1500)

# Hente verdi
navn = redis.get("bruker:1001:navn")  # "Ole Olsen"
poeng = redis.get("bruker:1001:poeng")  # "1500"

# Lagre JSON som verdi
import json
bruker_data = json.dumps({"navn": "Kari", "alder": 25})
redis.set("bruker:1002", bruker_data)

# Utløpstid (TTL - Time To Live)
redis.setex("session:abc123", 3600, "user_id:1001")  # Utløper etter 1 time

Bruksområder:


- Caching: Lagre ofte brukte data midlertidig
- Sessions: Brukersessions i webapplikasjoner
- Rate limiting: Begrense antall forespørsler per bruker
- Køer: Midlertidig lagring av oppgaver

Fordeler:
- Ekstremt rask (ofte i RAM)
- Enkel å forstå og bruke
- Perfekt for midlertidig data

Ulemper:
- Ingen spørrespråk (bare GET/SET)
- Ingen relasjoner mellom data
- Begrenset til minne (RAM) for mange implementasjoner

SQL vs. NoSQL – når bruke hva?

Det er ikke ett svar som passer alle. Velg basert på behov:

Bruk SQL (relasjonsdatabaser) når:

✅ Dataene har klare relasjoner (kunder, ordrer, produkter)
✅ Du trenger ACID-garantier (bank, booking-systemer)
✅ Skjemaet er stabilt og velkjent på forhånd
✅ Du trenger komplekse spørringer med JOIN
✅ Dataintegritet er kritisk

Eksempler: Banksystemer, e-handel, HR-systemer

Bruk NoSQL når:

✅ Du trenger ekstrem skalerbarhet (millioner av brukere)
✅ Dataene endrer struktur ofte
✅ Du har hierarkiske/nestede data (JSON-lignende)
✅ Du trenger høy ytelse på enkle operasjoner
✅ Du jobber med store mengder ustrukturerte data

Eksempler: Sosiale medier, sanntidsanalyse, IoT-data, logger

Hybrid-løsninger

Mange systemer bruker både SQL og NoSQL:
- SQL for kritiske transaksjoner (ordrer, betalinger)
- NoSQL for produktkataloger og brukerprofiler
- Redis for caching av ofte brukte data

Eksempel:

PostgreSQL (ordrer) + MongoDB (produkter) + Redis (sessions)
NoSQL: "Not Only SQL" – databaser som ikke følger relasjonsdatabasemodellen.

Dokumentdatabase: NoSQL-database som lagrer data som dokumenter (JSON/BSON).

Collection: Gruppe av dokumenter i MongoDB (tilsvarer tabell i SQL).

Nøkkel-verdi-lagring: Enkel database som mapper nøkler til verdier (som en dictionary).

Skjemafrihet: Mulighet til å endre datastruktur uten å definere fast skjema på forhånd.

Horizontal skalering: Spre data over mange servere for å håndtere større last.

ACID: Atomicity, Consistency, Isolation, Durability – garantier i relasjonsdatabaser.

CAP-teoremet: Du kan bare ha 2 av 3: Consistency, Availability, Partition tolerance.

📝Oppgave

Hva er hovedfordelen med dokumentdatabaser som MongoDB?

📝Oppgave

Når bør du velge SQL fremfor NoSQL?

📝Oppgave

Sammenlikn hvordan en blogg med kommentarer ville bli lagret i:
a) En relasjonsdatabase (SQL)
b) En dokumentdatabase (MongoDB)

Tegn tabellstrukturer for SQL og dokumentstruktur for MongoDB.

📝Oppgave

Du skal designe en database for en e-handelsplattform. Systemet har:
- Produkter (navn, pris, kategori, bilder, beskrivelse, spesifikasjoner)
- Kunder (navn, adresse, epost, bestillingshistorikk)
- Ordrer (produkter, antall, totalpris, status)

Diskuter:
a) Hvilke deler ville du lagre i SQL?
b) Hvilke deler ville du lagre i NoSQL?
c) Begrunn valgene dine.

📝Oppgave

Hva er en vanlig bruk for Redis (nøkkel-verdi-database)?

📝Oppgave

// --- Samleoppgaver ---

Du skal bygge et sosialt nettverk der brukere kan:
- Ha en profil med fleksibel informasjon (noen har hjemmeside, andre ikke)
- Poste meldinger (tekst, bilder, videoer)
- Følge andre brukere
- Like og kommentere på innlegg
- Se en feed med innlegg fra folk de følger

a) Design databasestruktur med både SQL og NoSQL
b) Beskriv hvilken data som skal i hvilken database
c) Skriv pseudokode for å hente "feed" (siste 50 innlegg fra folk jeg følger)
d) Diskuter skaleringsutfordringer og løsninger

Oppsummering

I dette kapittelet har du lært:

- NoSQL: ikke-relasjonelle databaser for fleksible data.
- Dokumentdatabaser: lagrer data som dokumenter (MongoDB).
- Nøkkel-verdi-lagring: rask tilgang (Redis).
- SQL vs. NoSQL: velg ut fra datastruktur og behov.
- Hybrid-løsninger: kombinere begge typer.

Noekkelbegreper


BegrepForklaring
NoSQLIkke-relasjonell database
DokumentdatabaseLagrer data som dokumenter (f.eks. JSON)
Nøkkel-verdi-lagerLagrer verdier knyttet til nøkler

Oppgaver

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.