-volatile storage: 휘발성 storage Ex) RAM
-non-volatile storage: 비휘발성 storage Ex) SSD, HDD
storage를 선택하는데 영향을 주는 요소
data access speed - performance적인 측면
cost per unit of data / reliability - mainternance적인 측면

위로 갈수록 빠르고, 비싸다
primary storage: 가장 빠르고, 휘발성인 storage (cache, main memory)
secondary storage: 메모리 계층에서 primary 다음 level의 storage, 비휘발성, 어느정도 빠름 (flash memory, magnetic disk)
tertiary storage: 계층의 가장 아래의 storage, 비휘발성, 느림, 주로 백업에 사용 off-line storage나 archival storage라고도 함 (magnetic tape, optical storage)
Disk interface
SATA(Serial ATA)
SAS(Serial Attached SCSI)
NVMe(Non-Volatile Memory Express)
주로 SATA와 NVMe가 많이 사용됨
SAN(Storage Area Networks) disk들을 network로 연결
NAS(Network Attached Storage) network file system protocol을 사용해 file system interface 제공
NAND flash
-보통 많이 사용됨, NOR flash보다 저렴
-page read에 20~100ms
-sequential read와 random read의 시간 차이가 HDD에 비해 적음 (여전히 Squential이 빠르긴 함)
-page는 한번만 write될 수 있음 / rewrite하려면 erase해야함
erase는 erase block단위로 발생함
erase를 기다리는것을 피하기 위해 logical address to physical address mapping을 remapping함
DB는 file의 모음으로 store됨
각 file은 record의 sequence
각 record는 field의 sequence
이후 설명들은 다음을 가정하고 설명함
i 번째 record store -> n * (i-1) 에서부터 store됨 (n: record size)
record가 block에 걸쳐져서 저장 될 수 있음
예) record size가 1000, block size가 4096인 경우 5번째 record는 해당 block을 넘어가게 됨
=> 복잡해지기 때문에 보통 record가 block을 넘어가는것을 허락하지 않음
i 번째 record를 삭제하면
Variable-length records

Slotted page header
record는 연속적으로 저장되어야 함
외부에서 각 record에 접근할 때, 바로 record ptr로 접근하지 말고 header의 entry로 접근
slotted page에 record를 넣을 때, 실제 record의 정렬을 유지하며 input하는게 아니라 header의 record offset array의 정렬을 유지
E.g blob/clob type
record는 page보다 작아야 함
대안
Record는 file의 빈공간 어디에든 들어갈 수 있음
record는 한번 할당되면 이동하지 않음
Free-space map

array의 각 entry는 n bit로 각 블럭의 빈 공간의 비율을 나타냄. 예시는 3bit이고 첫번째 entry를 보면 블럭이 4/8 즉 절반 비어있음을 알 수 있음.
second-level free-space map을 가질 수도 있음
예) 위 예시의 entry를 4개씩 묶어 가장 빈공간이 큰 block의 빈 공간을 표시 (4 7 2 6)
free space map은 주기적으로 기록됨 -> 오래된 값을 가질 수 있지만 크게 문제되지는 않음
file 전체에 sequential한 processing을 요구하는 application에 적절
Record들은 search key를 기준으로 정렬됨

삭제 - 삭제한 record 앞, 뒤 record들을 포인터로 연결 (실제 삭제는 rewrite할 때 수행됨)
삽입 - 정렬 맞춰서 삽입
삽입해야하는 곳에 빈 공간이 있으면? -> 그냥 삽입
없으면? -> overflow block에 삽입
삽입하고 포인터 연결하여 접근할 수 있도록 함
삽입, 삭제 일어난 경우 파일의 물리적/논리적 순서를 일치시키기 위해 파일 재구성 필요
복수의 relation을 한 file에 저장

동일한 조건으로 Join이 많이 발생될 때, 효율적임
= columnar representation
relation의 각 attribute를 따로 저장

= system catalog
metadata(data에 관한 data)를 저장