MongoDB
MongoDB 프로그래밍: 3강 NOSQL 데이터 모델링 기법 살펴보기
NOSQL 데이터 모델링 개념
Denormalization
- "비정규화" = 데이터 중복 허용
- 쿼리 프로세싱을 간단하게 하거나 최적화하기 위해서 또는, 사용자의 데이터를 특정한 데이터 모델에 맞추기 위해서 같은 데이터를 여러 도큐먼트나 테이블에 복제하여 중복하는 것을 허용함
- 비정규화로 인한 트레이드-오프
- Query data volume or IO per query VS Total data volume
- 쿼리당 IO 또는 쿼리 데이터 사이즈 VS 전체 데이터 사이즈
- Processing complexity VS Total data volume
-
비정규화하면 쿼리 수행을 위한 모든 데이터를 한 곳에 모아놓고 쿼리를 수행하기 때문에, 쿼리 수행을 위한 IO 숫자를 줄여 전체 성능을 향상시킬 수 있음
-
데이터 모델링 시점에서 데이터 정규화(중복 제거)를 하거나 쿼리 실행 시점에서 데이터 간의 연속적인 JOIN은 쿼리 프로세스의 복잡도를 증가시킴
-
시스템과 데이터 사이즈가 큰 분산 환경에서는 그 복잡도가 더욱 높아짐
-
데이터 비정규화를 하면 쿼리에 필요한 모든 데이터를 한 곳에 쿼리-친화적인 구조로 모아놓을 수 있기 때문에 전체적인 쿼리 프로세싱을 단순화하고 수행 시간 단축이 가능
-
해당 데이터는 다른 쿼리 수행을 위해 다른 도큐먼트나 테이블에 중복 저장되기 때문에 사이즌 필연적으로 증가함
Aggregates
- "유연한 스키마" 속성은 복잡하고 다양한 구조의 내부 요소(nested entities)를 가지고 있는 데이터 클래스를 구성 가능케 함
- 1:n 관계를 최소화하여 결과적으로 JOIN 연산을 줄임
- 수행 시간 단축, 저렴한 비용의 대용량 데이터 지원 가능
- 복잡하고 다양한 비지니스 요소를 담을 수 있음
- 추후 확장성 및 변동성에 대한 유연한 대응 가능
- 대부분의 NoSQL 솔루션은 기본적으로 "유연한 스키마"를 제공함
- NoSQL의 schema-less 특성을 이용하면, 데이터 모델을 하나의 테이블로 합칠 수 있음
Application Side Joins
-
대용량 데이터에 대해 빠른 응답 성능과 확장성, 가용성을 최우선 목적으로 하기 때문에, 쿼리 타임 조인을 최대한 피하여 데이터 모델을 구성하는 것을 가정함
-
JOIN 대상 데이터에 대해 비정규화, 어그리게이션을 수행할 때 문제가 발생하는 경우
- JOIN 대상 데이터가 다대다(n:m) 관계를 가짐
- JOIN 대상 데이터의 수시 변동
-
대상 데이터가 수시로 변경되는 경우, 비정규화와 어그리게이션을 통해서 많은 entity에 해당하는 데이터의 중복을 허용했기 때문에 해당 데이터 업데이트 시에 모두 찾아서 업데이트해야 하기 때문에 많은 비용 발생함
-
이런 경우, 차라리 변경이 잦은 데이터만을 추려내어 쿼리 타임 조인을 수행하는 것이 대안
주요 NOSQL 데이터 모델링 기법
General Modeling Techniques
- Atomic Aggregates
- Enumerable Keys
- Dimensionality Reduction
- Index Table
- Composite Key Index
- Aggregation with Composite Keys
- Inverted Search - Direct Aggregation
Composite Key
- 하나 이상의 필드를 deliminator(:)를 이용하여 구분 지어 사용하는 방법
- Ordered KV Store의 경우에는 이를 이용하여 order by와 같은 sorting 기능이나 grouping을 구현 가능
- NoSQL N개의 서버로 구성된 클러스터로 동작하는 데이터는 Key를 기준으로 N개의 서버에 나눠서 저장이 됨
- Key를 선정할 때는 전체 서버에 걸쳐서 부하가 골고루 분산될 수 있는 Key를 선정해야 함
Inverted Search Index
- value의 내용을 key로 하고, key의 내용을 반대로 value로 하는 패턴
- 검색 엔진에서 많이 사용하는 방법
- 검색 엔진은 사이트의 모든 페이지를 검색 로봇이 검색해서 문서 내의 단어들을 색인하여 URL에 맵핑해서 저장해놓음
- 검색은 단어를 key로 검색하기 때문에, value에 검색 키워드들이 들어가있을 경우에는 효과적인 검색이 불가함
- 검색 키워드를 key로 해서 URL을 value로 하는 테이블을 다시 만든 다음, 검색 키워드로 검색을 하면 신속하게 검색 키워드를 가지고 있는 URL을 찾아낼 수 있음
계층 데이터 구조 모델링 패턴
-
NoSQL은 다양한 데이터 모델이 있지만, 기본적으로 row, column을 가지고 있는 테이블 구조의 저장 구조를 갖음
-
어플리케이션 개발 중에는 이런 테이블 구조 뿐만 아니라 Tree와 같은 계층형 데이터 구조를 저장해야 할 경우가 있는데, NoSQL은 이러한 계층형 구조를 저장하는 것이 쉽지 않음
-
RDBMS의 경우에도 이런 계층형 구조를 저장하기 위해서 많은 고민을 해왔기 때문에, 솔루션에서 기능적으로 자체 지원하기도 하고 데이터 모델링을 통해서 계층형 구조를 저장할 수 있음
-
NoSQL에서 계층형 구조를 저장하는 기법은 RDBMS에서 사용하는 기법들을 참고하여 구현함
Tree Aggregation
- Tree 구조 자체를 하나의 Value에 저장하는 방식
- JSON이나 XML 등을 이용하여 트리 구조를 정의하고, Value에 저장함
- Tree 자체가 크지 않고, 변경이 많이 없는 경우에 적합함
Materialized Path
-
Tree 구조를 테이블에 저장할 때, root에서부터 현재 노드까지의 전체 경로를 key로 저장하는 방법
-
구현에 드는 노력에 비해서 매우 효율적인 저장 방식
-
Key에 대한 Search를 할 때 Regular Expression을 사용할 수 있으면, 특정 노드의 하위 트리 등을 쿼리해 오는 기능 등 다양한 쿼리가 가능
NOSQL 데이터 모델링 예시
도메인 모델 파악
- 어떤 데이터 개체가 있는지, 개체 간의 관계 분석
- ERD를 그려 도식화
- RDBMS 모델링 접근 방법이긴하지만, NoSQL에서도 저장할 데이터를 명확하게 이해하기 위한 필수
쿼리 결과(데이터 출력 형태) 디자인
- 도메인 모델 기반으로 어플리케이션에서 쿼리가 수행되는 결과값을 먼저 정함
- 출력 형식을 기반으로 필요한 쿼리 정의
- 출력 데이터를 기반으로 테이블 추출
패턴을 이용한 데이터 모델링
- NoSQL은 Sorting, Grouping, Join 등의 연산을 제공하지 않기 때문에 Get / Put 으로만 데이터를 처리할 수 있는 형태로 데이터 모델을 재정의
기능 최적화
- 첨부 파일
- 포스팅에 의존적이며 변경이 적고, 개수가 많지 않기 때문에 하나의 필드에 모아서 저장하는 것이 나음
- 분류에 따른 포스팅 출력
- 현재는 포스팅 순서대로만 출력 가능
- 포스팅에 분류 필드를 별도로 넣고, 필드에 따라 where문으로 select할 수 있어야 함(Secondary Index)
NoSQL 선정 및 테스트
- 모델링한 데이터 구조를 효과적으로 실행할 수 있는 NoSQL 검토
- NoSQL 특성 분석 및 부하테스트, 안정성 / 확장성 테스트 수행
- 경우에 따라서는 여러 개의 NoSQL을 복합하여 사용
- 하나의 NoSQL만으로 모든 데이터를 처리하려고 하지 말고, RDBMS와 혼용하거나 다른 NoSQL과 연동하여 최적의 시스템을 설계
선정된 NoSQL에 최적화 및 하드웨어 디자인
- 선정된 NoSQL에 적함하게 데이터 모델을 최적화
- 해당 NoSQL에 맞는 어플리케이션 인터페이스 설계
- 구동시킬 하드웨어 디자인
- 반드시 데이터 모델과 내부 아키텍쳐를 제대로 파악하고, 그에 맞는 NoSQL을 선정
결론
- NoSQL 시스템 개발 시, 데이터 모델링이 80% 이상을 차지함
- 선정한 NoSQL과 어플리케이션 특성에 맞는 데이터 모델링에 집중
학습정리
- NOSQL 데이터 모델링
- 비정규화, 어그리게이션, 어플리케이션 사이드 조인
- 주요 NOSQL 데이터 모델링 기법
- General Modeling Techniques: Composite Key Index, Index Table 등
- Hierarchy Modeling Techniques: Tree Aggregation, Materialized Paths 등
- NOSQL 데이터 모델링 절차
- 도메인 모델 파악, 쿼리 결과 디자인, 패턴을 이용한 데이터 모델링, 기능 최적화, NOSQL 선정 및 테스트, 선정된 NOSQL에 최적화 및 하드웨어 디자인