Database

En **database** er strukturert samling av relaterte data, begrepet er vanligvis knyttet til elektroniske datasystemer. Et databasesystem skal kunne behandle store mengder data effektivt, motsetningsfritt og sikkert. Databasesystemet skal sikre at endringer og tilføyelser ikke fører til motsetninger eller feil, og skal kunne levere riktig informasjon effektivt til brukere og programvare.

Et databasesystem har to deler – databasehåndteringssystemet (DBMS) som er programvaren som administrerer systemet, og selve databasen, som er data som håndteres av systemet. DBMSen organiserer dataene og styrer all lesing og skriving til databasen. For å kommunisere med DBMS-en brukes et spørrespråk.

Det finnes ulike sorter databasesystemer. Metoden man bruker for å organisere data kalles en datamodell. Den vanligste formen for databasesystem er basert på relasjonsmodellen. 

## Datamodell

Databasemodellen er en teori eller en spesifikasjon for hvordan en database er strukturert og brukt.

Det første kommersielle DBMS, IDS, var en **nettverksdatabase**.

IMS, som ble det første utbredte databasesystemet var en **hierarkisk database**. 

I moderne tid er den vanligste formen for databasesystem relasjonsdatabaser. Relasjonsdatabaser bygger på relasjonsmodellen, som er basert på førsteordens predikatlogikk og ble formulert i 1969–70 av Edgar F. Codd. Sentrale begreper i Codds arbeider er normalisering og relasjonsalgebra. I en relasjonsdatabase er dataene organisert i tabeller. Disse tabellene bindes sammen og reguleres av nøkler. 

Det finnes en rekke ulike databasehåndteringssystemer for relasjonsdatabaser. Informasjonen i Wikipedia er eksempelvis organisert i en MySQL relasjonsdatabase.

Objektdatabaser er basert på samme grunnprinsipper som datastrukturer i objektorientert programmering. I objektdatabaser lagres informasjon i objekter som står i relasjoner til hverandre. Objekter er organisert i klasser og man bruker vanlige programmerings-strukturer som subklasser og interface. 

Objektrelasjonelle databaser er basert på relasjonsmodellen, men de har en utvidet funksjonalitet som gjør at de håndtere objekter/ sammensatte faktatyper. Det er også mulig å lage pekere til andre relasjoner og legge metoder til faktatypene. Et viktig motiv for utviklingen av denne modellen er å gi bedre samsvar mellom relasjonsdatabaser og objektorienterte programmerings- og modelleringsspråk. SQL:1999-standarden tok inn en rekke av idéene bak den objekt-relasjonelle modellen, og enkelte vil si at DBMS-er som følger denne standarden kan betraktes som objektrelasjonelle.

XML er et markeringsspråk som kan brukes til *semi-strukturerte* data. Semistrukturerte data har en viss struktur, men kan være irregulær og ufullstendig. På grunn av fleksibiliteten til XML kan språket brukes som kommunikasjonsspråk mellom ulike databaser og til organisering på World Wide Web. Standarden for XML 1.0 ble publisert i 1998 av W3C.

## ACID-prinsippet
ACID (Atomicity, Consistency, Isolation, Durability) er et sett av krav som sikrer at operasjoner på databaser utføres pålitelig. 

En operasjon på en database er **atomær** hvis DBMS-et sikrer at hvis en del av operasjonen ikke utføres så utføres heller ikke andre deler – alt eller ingenting. En serie operasjoner på en database som sammen bevarer databasens konsistens kalles en transaksjon. En serie operasjoner som fører til inkonsistens eller brudd på integretsregler er ikke gyldig og må kunne oppheves/tilbakeføres. 

Databasen skal være **konsistent** med reglene for databasen både før en operasjon utføres og etter at den er avsluttes (men den kan være inkonsistent mens operasjoner utføres). Konsistensen sikres med *integretetsregler*. I relasjonsdatabaser er nøkler viktige integretetsregler innenfor og mellom tabeller. ''Beskrankninger'' på enkeltattributter* bestemmer lovlige statuser for en enkel verdi. *Assertions* er fastsatte kontroller som kan omfatte alle deler av databasen, denne funksjonaliteten støttes bare av enkelte DBMS-er. *Triggere* er operasjoner som utføres når fastlagte hendelser inntreffer. 

*'Isolasjon** innebærer at operasjoner ikke kan arbeide med data som er i en midlertidig endret tilstand på grunn av at andre prosesser arbeider med dem. Dette er ikke noe problem hvis systemet arbeider serielt – hvis det bare behandler en og en operasjon. Men i praksis designes databasesystemer for at mange prosesser skal kunne arbeide parallelt. Prinsippet om [[serialiserbarhet]] innebærer at operasjoner skal utføres slik at det finnes en seriell utførelse som gir samme resultat. Rekkefølgen av operasjonene kan ha stor betydning for resultatet, men det skal ikke være slik at forskjellige operasjoner blandes sammen og gir et helt uventet resultat. 

**Varighet** innebærer at resultatet av utførte transaksjoner aldri kan forsvinne. Dette innebærer at databasen skal takle ulike forventede og ikke-forventede hendelser, som for eksempel systemkrasj eller fysiske feil.

==Systemarkitektur==
3-skjemaarkitektur er et viktig prinsipp i moderne databasesystemer. Denne innebærer en deling av databasesystemet i presentasjonslaget, det konseptuelle(logiske) laget og det fysiske laget. Målet med denne delingen er at man skal kunne endre deler av databasesystemet uten at det er nødvendig å endre andre lag. For eksempel kan man endre måten tall lagres på(fysisk lag) uten å endre informasjonen om hva som skal lagres i systemet (logisk lag).

==Databasehåndteringssystem (DBMS)==
Den sentrale programvaren i et databasesystem er [[databasehåndteringssystem]]et (DBMS). Databasehåndteringssystemet skal ta seg av opprettelse, endringer og lesing i databasen. 

Det første kommersielle databasehåndteringssystemet, IDS, ble utviklet i 1964 av General Electric. I 1968 lanserte [[IBM]] systemet IMS, som fikk en bred anvendelse, og som fremdeles er i bruk i mange gamle datasystemer.

I 1979 lanserte [[Oracle (selskap)|Oracle]] den første kommersielle DBMS som var basert på relasjonsmodellen. I første del av åttitallet kom også flere andre relasjonsdatabasesystemer på markedet. Relasjonsdatabasene fikk stadig høyere markedsandel i slutten av åttitallet og begynnelsen av nittitallet.

==Transaksjonslogg==
Logging er den viktigste teknikken et databasesystem har for å hindre feil og tap av data. Loggen arbeider vanligvis både etter både undo- og redo-prinsippet. **Undo-loggen** har en linje for hver skriveoperasjon der det er registrert hva den aktuelle verdien var før endringen. Først utføres operasjonen i [[RAM|arbeidsminnet]], deretter skrives loggen til [[lagringsmedie]]t og til slutt skrives de nye verdiene til lagringsmediet. Hvis operasjonen var vellykket noteres ''commit'' i loggen, hvis den ikke var gyldig skrives ''abort'' og endringene tilbakeføres. Da er kun fullstendig transaksjoner som overholder prinsippet om atomitet og konsistens utført (se [[Database#ACID-prinsippet|ACID]]). Hvis det skjer en feil, f.eks. hvis strømmen går midt i en eller flere transaksjoner, kan systemet bruke undo-loggen til å tilbakeføre alle operasjoner der det ikke er notert commit eller abort. Man taper de halvferdige operasjonene, men man sikrer at databasen er i en konsistent tilstand. **Redo-loggen*' virker på samme måte, men noterer hva de aktuelle verdiene var etter endringen. Redo-loggen kan brukes til å gjenopprette databasen fra en tidligere versjon, eller et såkalt sjekkpunkt, der man vet at databasen var konsistent. Man tar utgangspunkt i siste sikre versjon og gjenoppretter alle verdier som er merket commit.

Hvis operasjonen innebærer fysiske endringer, for eksempel uttak fra minibank, utføres fysisk operasjon etter at commit er notert.

==Spørrespråk==

Et spørrespråk (engelsk: *query language*) er et forenklet språk som brukes i kommunikasjon med databaser og informasjonssystemer.

I 1976 lanserte IBM spørrespråket [[SQL]], som ganske etter hvert ble regulert av standarder fastsatt av ISO og støttes av praktisk talt alle relasjonsdatabasesystemer. De fleste DBMS-er har imidlertid egne tolkninger og tillegg til standarden, man snakker derfor om ulike dialekter av SQL. 

[[Objektdatabase]]r behandles ved hjelp av spørrespråket OQL, som bevisst er gjort så likt SQL som mulig.

[[XQuery]] er et spørrespråk som er utviklet for å kunne gjøre spørringer mot XML-data.

==Distribuerte databaser==
En distribuert database er en database som er spredt over flere datamaskiner, noder, som er bundet sammen i et nettverk. Hvis samme data finnes på flere noder sier man at disse data er *replikerte*. Hvis alle data er replikert til alle nodene er databasen *fullreplikert''.

## Se også
* Flatfildatabase

## Referanser