파처 ch4) Fundamental File Structure Concepts
사람 정보 저장
문제점
- 사람 record 간에 구별이 되어있지 않음
- record 안에서 field에 대한 구별이 되어있지 않음
File Organization
- field : 논리적인 의미를 갖는 가장 작은 단위
- Fixed-length fields
- Variable-length fields
(1) Begin each field with a length indicator
(2) Separate the fields with delimiters
(3) Use "keyword = value" expression to identify fields
- record : field의 집합 (파일을 더 높은 수준의 조직체계로 볼 때 사용)
- Fixed-length records
- Variable-length records
(1) Make records a predictable number of fields
(2) Begin each record with a length indicator
(3) Use an index to keep track of addresses
(4) Place a delimiter at the end of each record
Field Structures : Fix the Lengh of Fields
- 고정된 길이의 fields를 설정해놓기
ex) 학번 : 10B
이름 : 20B
학년 : 1B
- 각 레코드에 대해 동일한 학번B, 이름B, 학년B 를 할당해줌(공간 할당)
=> 공간 낭비라는 단점이 있음 (가변 길이 방식으로 저장하면 단점을 해결 가능)
Variable-length fields
1. Begin each field with a length indicator
- field 앞에 그 필드의 크기를 저장하는 방식
2. Separate the fields withdelimiters
- 다음 필드를 만나기 전에 | 를 두는 방식
3. Use a "keyword = value" expression to identify fields
- 키워드 = 값 형식으로 저장함
장점
- self-describing : 필드 자체의 정보를 제공
문제점
- 많은 공간을 낭비 (50% 이상의 파일 공간이 keyword를 위해 사용됌)
Record Structures : Fix the Lengh of Fields
- 각각 레코드들의 공간을 동일하게 만듦
Record Structures : Make Records a Predictable Number of Fields
- 고정된 바이트 수로 레코드를 확인하는 것이 아니라 고정된 수의 필드의 수로 확인을 하는 방식
Record Structures : Begin Each Record with a Length Indicator
- 각 레코드를 저장할 때 길어 정보를 넣어줌
- 레코드의 길이 정보를 가져와서 읽어줌
-> 랜덤하게 읽을 때 문제가 발생(처음부터 다 읽어줘야 하기 때문에 시간 낭비)
Record Structures : Use an Index to Keep Track of Addresses
- 인덱스 파일을 따로 만들어서 해당하는 바이트의 주소를 저장해놓음
Record Structures : Place a Delimiter at the End of Each Record
- 레코드 뒤에 Delimiter를 넣어주는 방식 (아래 예시에서는 #이 delimiter)
Example : A Record Structure Using a Length Indicator
- record organization 방법 선택은 데이터의 특성과 해당 데이터를 어떻게 활용하는지에 따라 달라짐
ex)
1. 파일에 가변 길이 레코드를 쓰는 방법
- ex) 5|apple, 7|bananas 처럼 길이 + 데이터 구조
2. 레코드 길이를 어떻게 표현할 것인가?
- 고정된 바이트로 길이 저장? 구분자 사용?
3. 파일에서 가변 길이 레코드를 읽는 방법
-먼저 길이를 읽고, 해당 길이만큼 데이터를 읽음
문제 : 파일에 어떻게 쓸 것인가 ?
1. 필드 길이 총합 계산 필요
-> 해결책 : 버퍼링(buffering)
먼저 메모리 버퍼에 모든 필드를 담은 뒤, 총 길이를 계산하여 파일에 씀
2. 길이 필드를 어떤 형식으로 파일에 쓸까?
-> 해결책 : 이진수(binary integer) : 공간 절약, 빠름
ASCII 문자 : 사람이 읽기 쉬움, 이식성이 높음
Mixing Numbers and Characters
(a) ASCII 형식 저장
- 사람이 읽을 수 있음
- 공백 없이 이어지면 식별 어려움
- 공간 낭비 : 숫자 1개에 문자 2개 사용
(B) Binary 형식 저장 (2바이트 정수)
- 공간 효율적 : 숫자 하나당 고정 2바이트
- 사람이 읽기 어려움
- 바이너리 파일 포맷, 데이터베이스 내부 처리에 자주 사용됨
Use of a File Dump
fwrite는 바이너리로 데이터를 저장
fprintf는 ASCII 코드 값을 저장