Flatfildatabase

En **flatfildatabase** er en database lagret i en fil som kalles en **flatfil**. Radene følger et uniformt format, og det er ingen strukturer for indeksering eller gjenkjenning av relasjoner mellom radene. Filen er "enkel". En flat fil kan være en ren tekstfil (f.eks. csv, txt eller tsv) eller en binærfil. Relasjoner kan finnes ved å trekke slutninger fra dataene i databasen, men databaseformatet i seg selv viser ikke slike sammenhenger eksplisitt.

Begrepet har vanligvis implisert en liten database, men veldig store databaser kan også være flate.

## Historie
I 1890 mens Herman Hollerith jobbet for Folketellingsbyrået i USA lagde han papirkort som var tabulerte med hullmaskiner, og dette var muligens det første eksempelet på en flatfildatabase.

I 1980-årene ble dataprogram med konfigurerbare flatfildatabaser populære på IBM PC og Macintosh. Enkeltpersoner kunne dermed enkelt lage sine egne databaser, og disse hadde en viss popularitet.

Eksempler på programvare for flatfildatabaser er tidlige versjoner av FileMaker, PC-File og dBase.

Flatfildatabaser er i dag vanlige og utbredte fordi de er lette å skrive og redigere, og passer til utallige formål på en ukomplisert måte.

## Skilletegn kontra fast lengde
Rene tekstfiler inneholder vanligvis en ''record'' per linje. Det finnes flere ulike konvensjoner for å beskrive dataene. For eksempel med kommaseparerte filer og tabseparerte filer kan feltene skilles med skilletegn som komma eller tab. I andre tilfeller kan hvert felt ha en fast lengde, og korte verdier "polstres" med mellomrom. Ekstra formatering kan være nødvendig for å unngå konflikter mellom skilletegn.

Bruk av skilletegn gir ekstra overhead ved at man må bestemme hvilke skilletegn som er brukt hver gang man skal prosessere filer (motsetning til formatering med faste kolonnebredder), hvilket kan påvirke ytelsen. Bruk av skilletegn (særlig komma) kan også sees på som en primitiv form for datakompresjon som kan hjelpe den generelle ytelsen på systemene gjennom reduksjon av datavolum, som særlig er en fordel ved dataoverføringer. Bruk av skilletegn som inkluderer en lengdekomponent (deklarativ notasjon) er relativt sjeldne, men reduserer vesentlig av overheaden med å finne størrelsen på hvert av feltene.

## Eksempler på flatfildatabaser
Eksempler på vanlige flatfiler inkluderer `/etc/passwd` og `[[Gruppeidentifikator|/etc/group]]` på Unix-lignende operativsystemer. Et annet eksempel på en flatfil er en navn- og postadresseliste med felt som *navn*, *adresse* og *telefonnummer*.

En liste med navn, adresser og telefonnumre som er skrevet for hånd på et ark et fysisk eksempel på en flatfildatabase. Dette kan også gjøres med noen skrivemaskin eller et tekstbehandlingsprogram. Et regneark eller en teksteditor kan brukes til å implementere en flatfildatabase som deretter kan skrives ut eller brukes online for forbedret søkefunksjonalitet.

## Moderne implementeringer
Lineær datalagre av NoSQL-data, JSON-formaterte data, primitive regneark (eksempelvis med komma- eller tabseparator) og tekstfiler kan alle sees på som flatfildatabaser, fordi de mangler integrert indekser, innebygde referanser mellom dataelementer og komplekse datatyper. Eksempler på programmer som kan benytte seg av flatfildatabaser er administrasjonsverktøy for boksamlinger, avtaler eller adressebøker, og disse kan da bruke enkle flatfiler (uten indekser eller pekere) for lagring og henting av informasjon.

## Hva er en flatfildatabase og ikke?
Mens en bruker kan lage en innholdsfortegnelse i en tekstfil, så inneholder ikke tekstfilformatet i seg selv noe slags konsept om en innholdsfortegnelse. Mens en bruker kan skrive "venn med Katrine" i et avsnitt for bemerkninger i Jon sin kontaktinformasjon vil dette bli tolket av brukeren, og er ikke en innebygd egenskap i flatfildatabasen. Når et databasesystem begynner å gjenkjenne og kode forhold mellom radene begynner det å gå bort fra å være "flatt", og når man har et detaljert system for å beskrive typer og hierarkiske relasjoner har man fått en struktur som er for strukturert for å kunne anses som "flat".

## Eksempel på en flatfildatabase
Følgende eksempel illustrerer typiske elementer i en flatfildatabase. Dataoppsettet består av en serie av kolonner og rader organisert i et tabellformat. Dette konkrete eksempelet bruker bare en tabell.

Kolonnene i dette eksempelet er *navn* (navnet på en person, i den andre kolonnen), *lag* (et idrettslag, i den tredje kolonnen) og en numerisk unik *id* (brukt for å identifisere rader, i første kolonne).

Under følger et eksempel på en tekstlig representasjon av de beskrevne dataene:
 id navn lag
 1 Nora Blå
 2 Emil Rød
 3 Oliver Blå
 4 Emma Blå
 5 Sofie Rød
 6 Liam Blå
 7 Maja Blå
 8 Henrik Rød
 9 Henrik Blå
Denne type datarepresentasjon er ganske standard for en flatfildatabase, selv om det er noen flere betraktninger som ikke er umiddelbart synlig fra teksten:

* **Datatype:** Hver kolonne i en databasetabell som den ovenfor er vanligvis begrenset til et bestemt datatype. Slike restriksjoner håndheves vanligvis opprettet ved konvensjon, men er ikke formelt er angitt med mindre dataene blir overført til et relasjonsdatabasesystem.
* **Separerte kolonner:** I eksempelet ovenfor er de enkelte kolonnene adskilte ved hjelp av et mellomromtegn. Dette kalles også dataformatering ved innrykk eller "fast bredde". En annen vanlig konvensjonen er å separere kolonner ved hjelp av én eller flere skilletegn, for eksempel et tabulatorinnrykk eller komma (se csv).
* **Relasjonell algebra:** Hver rad i tabellen ovenfor oppfyller standarddefinisjonen av en tuppel i relasjonsalgebra (eksempelet ovenfor viser en serie av 3-tupler). I tillegg angir den første raden feltnavnene som assosieres med verdiene i hver rad.
* **Databasehåndteringssystem:** Siden de formelle operasjonene man kan gjøre med en tekstfil vanligvis er ganske begrensede uten at man gjør en del forutsetninger er det ikke uvanlig at tekstfiler brukes som et melomledd før dataene overføres til et databasehåndteringssystem.

## Se også
* /etc/passwd -- en vanlig flatfil brukt om brukerdetaljer i Unix
* CSV, vanlig filformat med kommaseparerte verdier
* Berkeley DB, en typisk flatfildatabase
* Awk, en klassisk flatfilprosessor
* Recfiles, et filformat for rene tekstdatabaser

## Referanser