[NoSQL] [MongoDB] NOSQL 데이터 모델링 기법 살펴보기

[MongoDB] NOSQL 데이터 모델링 기법 살펴보기

MongoDB

  • 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
      • 쿼리 수행의 복잡도 VS 전체 데이터 사이즈

 

  • 비정규화하면 쿼리 수행을 위한 모든 데이터를 한 곳에 모아놓고 쿼리를 수행하기 때문에, 쿼리 수행을 위한 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에서 사용하는 기법들을 참고하여 구현함

    경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
    어린이용이며, 설치가 필요없는 브라우저 게임입니다.
    https://s1004games.com

Tree Aggregation

  • Tree 구조 자체를 하나의 Value에 저장하는 방식
  • JSON이나 XML 등을 이용하여 트리 구조를 정의하고, Value에 저장함
  • Tree 자체가 크지 않고, 변경이 많이 없는 경우에 적합함
  • 예시: 계층형 게시판의 답글 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에 최적화 및 하드웨어 디자인

 

[출처] https://velog.io/@hwaya2828/MongoDB-NOSQL-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EA%B8%B0%EB%B2%95-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0

 

 

 

 

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86127
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78631
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95351
158 [기계학습][머신러닝] [인공지능] 지도학습, 비지도학습, 강화학습 file 졸리운_곰 2025.03.14 1336
157 [기계학습][머신러닝][딥러닝] 머신러닝 하루 만에 배우려고 하지 마라 file 졸리운_곰 2025.03.09 1203
156 [DeepLearning] Learning to generate lyrics and music with Recurrent Neural Networks : 순환 신경망을 사용하여 가사와 음악을 생성하는 방법 배우기 file 졸리운_곰 2024.11.29 1003
155 [tensorflow 1.13 1.x 버전 설치법] [TensorFlow] Anaconda 가상환경 이용하여 TensorFlow GPU 설치 졸리운_곰 2024.01.08 1565
154 [AutoML][AutoKeras] [OSS] AutoKeras로 자동학습(AutoML) 하기 file 졸리운_곰 2023.07.02 1557
153 [Tensorflow 2.0] 모델 저장하고 불러오기 졸리운_곰 2023.05.21 1008
152 [pytorch] Pytorch에서 학습한 모델 저장 및 불러오기 졸리운_곰 2023.05.21 1824
151 [pytorch] Using BERT with Pytorch file 졸리운_곰 2023.03.06 1089
150 [pytorch] Full NMT model from pretrained BERT file 졸리운_곰 2023.03.06 937
149 [기계학습][딥러닝] PyTorch Hello World 졸리운_곰 2023.02.12 1226
148 [기계학습] [번역] TensorFlow Lite 튜토리얼 3 부 : Raspberry Pi의 음성 인식 졸리운_곰 2022.11.18 1102
147 [기계학습] [번역] TensorFlow Lite 튜토리얼 2 부 : 음성 인식 모델 교육 졸리운_곰 2022.11.18 1194
146 [기계학습] [번역] TensorFlow Lite 튜토리얼 1 부 : Wake Word 기능 추출 졸리운_곰 2022.11.18 1057
145 [기계학습][딥러닝] Generative Adversarial Net (GAN) PyTorch 구현: 손글씨 생성 file 졸리운_곰 2022.11.18 1001
144 [기계학습][딥러닝] Flask를 이용하여 파이토치를 REST API로 베포하기 file 졸리운_곰 2022.11.12 1008
143 [기계학습][머신러닝][딥러닝] Vanilla GAN file 졸리운_곰 2022.11.08 810
142 [기계학습][머신러닝][딥러닝] Generative Adversarial Net (GAN) PyTorch 구현: 손글씨 생성 file 졸리운_곰 2022.11.08 1425
141 [기계학습][머신러닝][딥러닝] DCGAN 튜토리얼 file 졸리운_곰 2022.11.08 1019
140 [PyTorch] pytorch 기본 문법 및 코드, 팁 snippets file 졸리운_곰 2022.10.20 1065
139 [tensorflow] [인공지능] TensorFlow GPU 동작 확인 방법 file 졸리운_곰 2022.09.04 1003
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED