기본 개념
순차 구조 화일
레코드들을 조직하는 가장 기본적인 방법
화일 생성시에 레코드들을 연속적으로 저장하기 때문에, 접근할 때도 순서대로 접근해야 한다.
- 입력 순차 화일 : 레코드가 입력되는 순서대로 저장
- 키 순차 화일 : 레코드의 특정 필드 값 순서에 따라 저장
스트림 화일
데이터가 하나의 연속된 바이트 스트림(byte stream)으로 구성
연속적인 판독 연산을 통해 레코드가 화일에 저장되어 있는 순서에 따라 데이터를 접근
- 순차 접근 스트림 화일 : 순차 접근만 허용
- 임의 접근 스트림 화일 : 임의 접근이 허용
화일 접근 모드 (access mode)
화일 개방시 수행하려는 연산을 명세
판독(read), 기록(write), 갱신(read/write), 첨가(append) 등
순차 접근 스트림 화일
연속적으로 화일에 접근, 화일에 있는 모든 바이트를 처리하는 경우에 유용
임의 접근 스트림 화일
화일의 “시작 / 끝 / 현재 위치” 에서 오프셋 값을 이용하여 이전의 바이트를 접근하지 않고 직접 접근
순차 화일의 종류
입력 순차 화일
( = 히프 화일(heap file), 파일 화일(pile file))
- 데이터가 입력되는 순서대로 저장된 화일
- 레코드에 대한 분석, 분류, 표준화를 하지 않음
- 필드의 순서, 길이 제한이 없음
- 레코드의 길이, 타입이 일정하지 않음
- 레코드는 <필드, 값>의 쌍들로 구성
- 삽입 작업 : 삽입되는 레코드를 화일의 끝에 첨가
- 검색 작업 : 주어진 탐색 매개변수의 값과 이에 대응하는 화일 레코드 필드 값을 화일의 시작부터 비교하여 레코드를 선정 -> 선정된 레코드에서 원하는 필드 값을 검색
- 키 필드 : 레코드 선정 시 탐색 매개변수와 대응되는 데이터 필드
- 탐색 키 필드 (search key field) : 탐색 매개변수의 필드 - 삭제 작업 : 새로운 순차 화일을 동시에 생성
삭제 대상 레코드를 탐색하면서 기존의 레코드를 새로운 화일로 출력. 삭제 대상은 생략하고 나머지를 출력 - 변경 작업 : 새로운 순차 화일을 동시에 생성
변경 대상 레코드를 탐색하면서 기존의 레코드를 새로운 화일로 출력. 변경 대상은 변경하고 나머지를 출력
입력 순차 화일 응용 예
- 데이터를 처리하기 전에 임시로 수집만 해 놓는 경우
- 화일 조직을 결정하지 못한 경우
- 화일의 용도가 결정되지 않은 경우 (데이터 은행)
- 화일 조직의 변경 과정에서 중간 단계의 화일 형태로 이용
키 순차 화일
- 저장 장치에서의 레코드 순서와 레코드 리스트의 논리적 순서가 같은 구조의 화일
- 화일 내에서의 레코드는 키 필드 값에 따라 정렬
- 모든 레코드는 똑같은 순서의 데이터 필드를 가짐
- 데이터 필드는 화일 설명자(descriptor)에 한 번만 저장하면 됨
정렬된 화일(sorted file)
- 키 순차 화일처럼 레코드들이 특정 키 필드 값에 따라 정렬된 화일
- 정렬 키 : 정렬에 사용된 값의 필드
- 오름차순 : if (레코드 i의 키 값 ≤ 레코드 j의 키 값) then 레코드 i는 레코드 j 앞에 위치 / 내림차순은 반대
- 정렬 순서 : 응용에 따라 결정 (전화번호부의 경우 이름 순, 번호 순, 등록 순 등)
- 하나의 순차 화일은 두 개 이상의 다른 정렬 순서를 만족시킬 수 없음
- 다른 필드로 정렬을 하고 싶으면 같은 내용으로 다른 순서의 임시 화일을 만들고 사용 후 용도가 끝나면 삭제
순차 화일 특징
- 대화식(interactive) 처리보다는 일괄(batch) 처리에 유리
- 장점 : 데이터의 순차 접근에서는 차위 레코드의 접근이 신속, 데이터의 접근 형태를 고려하고 그 방법에 맞는 화일 구조를 선정
순차 화일의 설계
설계 시 고려 사항
순차 화일의 생성
화일 생성
- 데이터 저장 장치에 레코드들을 순서대로 입력하여 생성
- 키 순차 화일의 갱신 연산은 트랜잭션 화일을 이용
- 트랜잭션 화일은 데이터 수집 -> 레코드 형식으로 변환 -> 레코드 편집 -> 정렬 과정을 거쳐 생성
편집
트랜잭션 화일 생성 과정에서 입력되는 데이터 값에 오류가 있는지 검사하는 과정
검사 내용
- 입력된 값이 올바른 범위 안에 있는가
- 필수적인 필드 값의 존재 유무, 필드 타입 적절성, 필드 값 유효성, 관련 필드 값 유무
- 합계의 일치 (일괄 처리하는 모든 트랜잭션의 대한 총액의 합계는 입력의 합계와 같아야 한다.)
- 계수 (트랜잭션 레코드의 총수는 입력 레코드의 총수와 같다.)
- 숫자 타입 필드의 앞자리 공백은 0으로 채움
- 영숫자(alphanumeric)나 텍스트를 적절한 코드로 채운다. (STREET을 ST로 바꾼다.)
- 누락된 데이터 값을 삽입
편집과 정렬 작업
특정 응용 프로그램이나 범용 유틸리티 프로그램을 이용하여 수행
- 한 저장 장치에서 다른 저장 장치로 순차 화일을 복사
- 같은 저장 장치에서 하나의 순차 화일을 또 다른 순차 화일로 복사
- 레코드에 대한 간단한 편집 수행
- 레코드에 대해 간단한 재구성 수행
- 주어진 필드 값에 따라 오름차순/내림차순으로 화일을 정렬
- 여러 개의 정렬된 화일을 오름차순/내림차순으로 하나의 정렬된 화일로 합병
순차 화일의 갱신
순차 화일에서의 검색
- 레코드의 저장 순서에 따라 연속적으로 검색
- 레코드 검색 순서에 따라 레코드 입력 순서를 결정할 수도 있음
순차 화일에 대한 질의
연속적이고 레코드 전체에 대한 접근이 필요할 검색일 경우 효율적 (Ex. 사원 봉급의 평균?)
키 순차 화일에 대한 레코드 삽입
키 값에 따라 오름차순/내림차순을 유지해야 하므로 복잡
- 두 기존 레코드 사이에 삽입 위치를 검색
- 이 삽입점 앞에 있는 모든 레코드를 새로운 화일로 복사
- 새로운 레코드를 삽입
- 삽입점 뒤에 있는 나머지 레코드를 새로운 화일로 복사
키 순차 화일에 대한 레코드 삭제
- 삽입과 같은 단계, 삭제할 레코드를 제외하고 나머지 레코드만 새로운 화일로 복사
키 순차 화일에서의 레코드 수정
- 수정할 레코드 앞의 모든 레코드를 새로운 화일로 복사
- 원하는 레코드를 수정해서 새로운 화일에 삽입 후 나머지 레코드를 새로운 화일에 복사
(직접 접근 저장 장치에 저장된 화일은 순차 화일이지만 임의 접근이 가능하다. 수정을 기존 레코드 위치에서 수정. 복사가 필요 X)
순차 마스터 화일의 갱신
갱신 트랜잭션들을 ‘트랜잭션 화일’에 모아서 일괄 처리한다.
트랜잭션 화일의 트랜잭션 레코드는
- 마스터 화일과 똑같은 키로 정렬되어있다.
- 갱신 프로그램에 의해 마스터 화일에 적용이 된다.
- 각 트랜잭션 레코드는 대응하는 마스터 레코드의 키 값과 갱신 타입을 나타내는 갱신 코드를 포함한다.
- 새 레코드 삽입 : I / 기존 레코드 삭제 : D / 기존 레코드 수정 : C
키 순차 마스터 화일의 갱신 알고리즘
- 트랜잭션 화일과 순차 마스터 화일은 똑같은 키로 오름차순 정렬돼있고 각 화일의 레코드 키 값은 유일하다고 가정
- 트랜잭션 화일 레코드와 마스터 화일 레코드를 비교한다.
- 레코드 키 값이 두 화일에서 일치 -> 갱신 코드에 따라 레코드를 수정 혹은 삭제
- 트랜잭션 레코드 키 값이 마스터 화일의 레코드 중에 없으면 새로 삽입할 레코드로 판정 -> 마스터 파일에 삽입
오류 처리
- 마스터 화일에 있는 레코드 키 값을 가진 레코드를 삽입
- 마스터 화일에 없는 레코드 키 값을 가진 레코드를 삭제
- 마스터 화일에 없는 레코드 키 값을 가진 레코드를 수정
갱신 알고리즘의 핵심은 transKey와 masterKey의 비교
- transKey : 트랜잭션 화일의 레코드 키
- masterKey : 마스터 화일의 레코드 키
- 가정 : 화일의 끝을 표시하는 EOF는 어떤 레코드 키 값보다 크다.
순차 화일과 임의 접근
순차 화일의 저장
- 순차 접근 저장 장치 (테이프) 에는 당연히 저장이 가능
- 임의 접근 저장 장치 (디스크) 에도 저장이 가능 (실린더 단위로 저장하면 탐구 시간을 절약)
임의 갱신 (random update)
갱신 과정
- 해당 마스터 레코드를 판독 (위치 찾기)
- 마스터 레코드에 트랜잭션 적용
- 갱신된 마스터 레코드를 원래의 위치에 재기록
-> 해당 레코드만 읽고 원래 위치에 재기록하기 때문에 효율적이다
-> 레코드 삭제는 물리적으로 제거하는 것 보다는 해당 레코드 위에 “deleted” 플래그를 표시하여 논리적으로 삭제하는 것이 효율적
'File Processing [FP]' 카테고리의 다른 글
[FP] 06. 인덱스 구조 (2) | 2024.01.23 |
---|---|
[FP] 05. 화일의 정렬/합병 (0) | 2024.01.22 |
[FP] 03. 화일 입출력 제어 (2) | 2024.01.21 |
[FP] 02. 화일 저장장치 (0) | 2024.01.19 |
[FP] 01. 화일의 기본 개념 (0) | 2024.01.19 |