더북(TheBook)

이 데이터 구조에는 고객 정보는 물론 주문 정보도 포함되어 있다. 고객 정보는 속성명과 이에 대응되는 문자열 값으로 저장되어 있다. 주문 정보는 제품 식별자, 수량, 제품 설명, 가격이 포함된 리스트 구조의 요소로 구성된 배열에 저장되어 있다. 이 전체 리스트는 'ordID:781379' 같은 주문 키로 저장할 수 있다.

이와 같은 구조는 주문에 관한 많은 정보를 단일 키로 조회해 볼 수 있는 장점이 있다. 그럼 이런 데이터 구조를 어떻게 구현할 것인지 생각해보자.

고객이 첫 번째 제품을 장바구니에 담을 때 리스트가 생성되고 고객 데이터베이스에 있던 고객 이름과 주소가 이 리스트로 복사된다. 주문 배열이 만들어지고 제품 식별자, 수량, 제품 설명, 가격 정보가 이 배열에 추가된다. 그런 다음 키 값이 만들어지고 이 데이터 구조 전체가 디스크에 기록된다. 고객이 또 다른 제품을 장바구니에 추가하면 주문 제품에 대한 배열에 새 항목이 추가된다. 이 값은 원자(가장 상세한) 단위로 처리되므로 추가된 새 제품에 대한 리스트(예를 들어 고객 정보와 주문된 제품)는 다시 디스크에 기록된다. 제품을 추가할 때마다 이 과정이 반복된다.

첫 번째 값이 생성되었을 때 평균 주문 정보의 크기 정도로 키-값 데이터베이스가 저장 공간을 할당한다고 가정해 보자. 다섯 번째 제품을 추가하면 데이터 구조의 크기가 할당된 공간을 초과해 버릴 것이다. 따라서 새로운 제품이 ordItems 배열에 추가되면 이 새 제품에 대한 데이터는 새 블록에 기록될 것이다.

값의 크기가 증가하면서 데이터를 읽고 쓰는데 소요되는 시간도 증가할 수 있다. 일반적으로 데이터는 블록에서 읽는다. 만약 어떤 값의 크기가 블록의 크기보다 크면 이 값이 들어가 있는 블록 여러 개를 읽어야 한다. 쓰기 작업 진행 시 값의 일부분만 변경됐더라도 이 값 전체가 여러 블록에 다시 저장되어야 한다.

값 하나에 대한 읽기 작업을 수행하더라도 블록 전체를 읽어야 하므로 이 값의 크기가 블록의 크기보다 작으면 추가적인 불이익은 없다. 이 경우 판독 기록 헤드가 제 위치로 이동하는 시간과 블록을 읽는 시간은 같다. 값이 데이터 블록 크기보다 작을 때 값 여러 개가 블록 하나에 저장될 것이다. 따라서 한 블록을 읽을 때 이 블록에 있는 모든 값이 메모리 캐시에 추가될 것이다. 이렇게 되면 다음 번 읽기 작업을 수행할 때 필요한 값을 캐시에서 찾을 가능성이 커진다. 따라서 디스크에서 직접 읽기 작업을 수행하는 데 필요한 시간을 절약할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.