플랫 파일 데이터베이스

플랫 파일 데이터베이스()는 하나의 데이터 모델 (보통 하나의 테이블)을 플레인 텍스트 파일로 인코딩하는 방법 및 그런 방법을 쓴 일종의 데이터베이스를 총칭한다.
다시 말해 플랫 파일 데이터베이스는 순수 텍스트 파일 형태로 데이터를 저장한 데이터베이스를 일컫는다.
플랫 파일.
일반적으로 플랫 파일은 내부 한 줄마다 레코드 하나씩을 기록한다.
각 필드()에 대해 공간 채워넣기()를 통해 고정 너비를 갖게 하는 경우도 있으며 공백, 탭, 쉼표 같은 공백문자나 기타 지정한 문자로써 각 필드를 구분하는 경우도 있다. 이 경우에는 추가로 형식을 지정(포맷팅)하여 구분자가 실제 데이터 안에 쓰이는 ‘구분자 충돌’을 방지할 수 있다.
플랫 파일 내에는 구조적 관계는 존재하지 않는다. 플랫 파일은 관계형 데이터베이스와 같이 복잡한 모델이 아니라 종이 한 장 같은 ‘정형화’된 데이터를 가질 뿐이다.
"이름", "주소", "전화번호" 등 적은 개수의 필드로 구성된 주소록 같은 것이 플랫 파일 데이터베이스의 대표적인 예이다. 열과 행으로 이루어진 HTML 테이블도 플랫 파일 데이터베이스의 좋은 예이다. 이처럼 명시적으로 ‘데이터베이스’로 분류되지는 않지만 플랫 파일 데이터베이스는 일상 생활에서 자주 볼 수 있다.
구현.
사람이 손으로 작성할 수 있다. 종이 같은 데에 성명, 주소, 전화번호를 써내려가면 된다. 이것도 플랫 파일 데이터베이스의 일종이다. 타자기나 워드 프로세서로도 만들 수 있다. 수많은 소프트웨어가 플랫 파일 데이터베이스를 구현하도록 되어 있기도 하다.
역사상의 구현.
컴퓨팅 기기는 처음에는 단순한 데이터베이스를 구현하기 위해 쓰였다. 당시 허먼 홀러리스는 이름, 나이 등의 (미국) 주민 정보 하나가 숫자 및 문자를 이루면서도 길이가 정확히 80인 문자열 하나로 표현되도록 설정해야 했다. 각 주민의 성명이 길이를 똑같이 맞추기 위하여 공백을 채워야 했다. 그러면 데이터베이스 필드의 줄이 제대로 정렬되었다. 허먼 홀러리스는 미국 통계청에 이 아이디어와 이에 대한 기기, 천공 카드 등을 팔았고 실제로 주민 정보가 미국 통계청에서 이러한 수단을 써서 기록/수집된 바 있다. 1890년의 인구 조사는 최초의 전산화된 데이터베이스였다. – 실질적으로는 수천 개의 천공 카드를 담은 상자들이기도 하였다.
제 2 차 세계 대전이 끝나고 정부 기관이나 민간기업은 여러 해에 걸쳐 초창기 컴퓨터를 운용하였다. 이 컴퓨터들은 종종 플랫 파일 데이터베이스를 구현하기 위해 사용되었다. 대표적으로 급여 계산 등 회계 분야에 쓰였다. 그러나 오래지 않아 당시 엄청나게 비쌌던 컴퓨터를 효율적으로 쓰고자 하는 욕구가 강했고 이를 계기로 초창기 관계형 데이터베이스가 탄생하였다. 놀랍게도 초창기 응용들은 천공 카드의 원래의 디자인을 조금 바꾸고는 천공 카드를 계속 사용하였다. 홀러리스의 기업은 성장하여 컴퓨터 업계의 거인 IBM이 되었다. 이 회사는 당시 시장 전반을 지배하였다. 고정된 길이의 필드를 갖고 80-열 천공 카드로 운영되는 데이터베이스가 과연 정당한 것인지는 문제가 되기도 하였다.
1980년대에 매킨토시와 도스 상에서 ‘설정 가능한’ 플랫 파일 데이터베이스 응용 프로그램은 인기였다. 이 응용 프로그램은 개인 사용자가 각자가 사용할 데이터베이스를 디자인하는 것을 쉽게 해주었다. 이는 워드 프로세서나 스프레드시트의 인기에 버금갔다. 파일메이커의 초창기 버전, PC-파일 같은 것들이다. 이것들은 약간의 관계형 데이터베이스 기능을 제공했다. 파일 간 데이터 공유와 비슷한 기능이었다.
오늘날의 구현.
최근에는 사용자가 일반적인 용도의 플랫 파일 데이터베이스를 만들 수 있게 해 주는 프로그램은 있기는 하지만 그 수가 적다. 마이크로소프트 웍스(초창기 윈도 버전에만 들어있다.) 애플웍스, 클라리스웍스(윈도 및 매킨토시 용) 등에 플랫 파일 데이터베이스가 구현되어 있다. 볼랜드의 파라독스, 마이크로소프트 액세스 같은 것들도 있는데 이것들은 시간이 지나면서 관계형 데이터베이스 기능도 제공하면서 내장 프로그래밍 언어 기능도 제공하고 있기도 하다. MySQL이나 오라클 DBMS 같은 데이터베이스 매니지먼트 시스템(DBMS)들은 프로그래머가 응용을 직접 개발하기를 요구하고 있다.
오늘날에도 응용 프로그램이 설정 파일 같은 것을 저장하기 위해 플랫 파일 데이터베이스를 널리 사용한다. 많은 응용 프로그램이 플랫 파일에서 사용자들 고유의 정보를 얻어올 수 있도록 미리 정의된 필드를 사용한 플랫 파일을 제공한다. 작은 크기의 도서 관리 프로그램이나 일정 관리 프로그램, 특히 주소록 프로그램 등은 플랫 파일을 빈번히 이용하기도 한다. XML은 일반 텍스트 파일에 데이터를 저장할 때 쓰이는 매우 인기 있는 포맷이다. 하지만 XML에는 복잡하고도 많이 포개어진 데이터를 저장할 수 있기 때문에 XML을 플랫 파일 데이터베이스로 분류하는 것은 적절치 않다.
용어.
"플랫 파일 데이터베이스"라는 용어에는 크게 좁은 의미와 넓은 의미로 나뉘어 쓰인다. 사람들은 좁은 의미로쓰기도 하는데 좁은 의미로 쓰는 것이 데이터베이스 이론에 알맞은 것이다. 그러나 대다수의 사람들은 넓은 의미로 많이 쓴다.
좁은 의미에서 “플랫 파일 데이터 베이스”는 데이터와 구분자만 갖고 있는 것을 일컫는다. 넓은 의미에서 "플랫 파일 데이터베이스"는 열과 행의 형태를 가진 것으로서 테이블 구조 외에는 관계나 링크 같은 것들이 없는 단일 파일로 존재하는 데이터베이스를 일컫는다.
도구마다 사용하는 용어가 다르지만 개념은 같다. 이를테면 파일메이커()는 "Find"(찾기)라는 용어를 사용하고 MySQL은 "Query"(조회)라는 용어를 사용한다. 그러나 이들의 개념은 동일하다. 파일메이커는 "files"(파일)이라는 용어를 사용하고 MySQL은 "tables"(테이블)이라는 용어를 사용한다. 이들의 개념도 동일하다.
그러나 기본적인 용어인 "레코드"와 "필드"는 거의 모든 데이터베이스 구현에서 쓰이고 있다.
예제 데이터베이스.
플랫 파일 데이터베이스의 예제이다. 데이터는 행과 열로 조직되어 표 형식으로 표시된다.
이 예제에는 한 개의 테이블이 있다.
열은 - "이름" (사람 이름, 두 번째 열); "등급" (위키백과 사용자 등급, 세 번째 열); "고유 아이디", (레코드를 고유하게 식별하는 수) - 세 개를 갖고 있다고 가정하자.
앞에서 말한 데이터의 텍스트 표현이다.
 아이디 이름 등급
 1 철수 관리자
 2 영희 관리자
 3 찬희 일반사용자
 4 길동 일반사용자
 5 홍련 일반사용자
 6 민희 관리자
 7 길수 일반사용자
 8 형구 일반사용자
이런 식의 데이터 표현은 플랫 파일 데이터베이스 분야에서 자주 쓰인다. 약간의 추가적인 고려 사항이 있다.
플랫 파일 관계형 데이터베이스 스토리지 모델.
플랫 데이터베이스 모델과 단일 플랫 파일 데이터베이스과는 약간의 차이가 있다. 또한 관계형 데이터베이스 모델과 다수의 플랫 파일 테이블과와도 약간의 차이가 있다. 플랫 파일이 관계형 데이터베이스에 속하려면 관계형 데이터베이스 매니지먼트 시스템이 알아서 다수의 플랫 파일들 사이의 외부 키 관계를 해석할 수 있어야 한다.
첫 번째 파일
 파일-오프셋 아이디 성명 등급
 0x00 8 형구 일반사용자
 0x13 1 철수 관리자
 0x27 3 찬희 일반사용자
 0x3B 4 길동 일반사용자
 0x4F 5 홍련 일반사용자
 0x62 7 길수 일반사용자
 0x76 6 민희 관리자
 0x8A 2 영희 관리자
파일 오프셋은 실질적으로는 데이터베이스의 일부가 아니다. 관계를 설명하기 위해 존재한다.
두 번째 파일 
 등급 모임장소
 관리자 광화문 앞
 일반사용자 동대문운동장
위와 같은 예제를 보면 플랫 파일은 현대적인 관계형 데이터베이스의 데이터 저장소 역할을 할 수 있다. 관계형 데이터베이스 매니지먼트 시스템이 인덱스(색인), 검색 제한(콘스트레인트), 트리거(trigger), 외부 키 관계, 단편화 계획, 중복화 계획 및 분산된 관계형 데이터베이스 개념 등을 이러한 플랫 파일들에 담아두기만 해도 훌륭히 데이터베이스로서 동작할 수 있다.
"첫 번째 파일"에 대한 "성명" 필드의 인덱스의 예.
인덱스의 예는 다음과 같다.
 0x00000013
 0x0000008A
 0x00000027
 0x0000003B
 0x0000004F
 0x00000076
 0x00000062
 0x00000000