데이터베이스 스키마
MongoDB는 관계형 데이터베이스와 같은 데이터베이스 스키마 개념이 없다. 이것이 바로 몽고DB를 포함한 많은 NoSQL데이터베이스를 스키마리스 또는 유연한 데이터베이스라고 불리는 이유이다.
--> 스키마가 전혀 없다는 뜻은 아니다.
MongoDB는 CREATE TABLE과 같이 컬렉션(Collection, RDBMS의 테이블)의 모든 필드 이름, 데이터 타입, 제약 조건을 정의할 필요가 없다.
- 특징
- 문서별 유연성 : 같은 컬렉션 안의 문서라도 서로 다른 필드들을 가질 수 있다. 어떤 문서는 특정 필드를 가지고, 다른 문서는 그 필드가 없을수도 있으며, 필드의 데이터 타입이 다를수도 있다.
- 즉각적인 사용 : 데이터를 삽입하면 컬렉션이 자동으로 생성되며, 스키마 정의 과정 없이 바로 사용할 수 있다.
MongoDB 데이터 모델링
MongoDB 데이터 모델링은 RDBMS의 스키마 설계와는 다른 접근 방식을 요구하는 MongoDB사용의 핵심이자 가장 중요한 부분이다. MongoDB는 스키마리스이므로, 개발자가 데이터를 어떤 문서 형태로 구성하고 컬렉션에 저장하며 문서 간의 관계를 어떻게 표현할지 명확히 설계해야 한다.
몽고DB 데이터 모델링은 애플리케이션 요구사항을 기반으로 데이터를 문서(Document)형태로 구조화하고, 컬렉션을 구성하여 성능, 확장성, 유연성 및 개발 편의성을 최적화할지 결정한다.
RDBMS가 테이블 간의 관계(JOIN)를 통해 데이터를 정규화하는데 중점을 둔다면, 몽고DB 모델링은 데이터의 중복을 허용하더라도, 쿼리 효율성을 높이는 '비정규화' 전략을 적극적으로 고려한다.
MongoDB 데이터 모델링의 핵심 원칙 및 패턴
몽고DB 데이터 모델링의 가장 핵심적인 결정은 관련된 데이터를 하나의 문서에 포함할 것인지, 아니면 별도의 문서로 분리하여 참조할 것인지를 결정하는 것이다.
1.임베딩(Embedding) - '포함' 모델
- 정의 : 관련된 데이터를 주 문서 안에 중첩된 문서나 배열 형태로 직접 포함시키는 방식이다.
- One to Few, One to One 관계, 주 문서와 함께 포함된 문서가 함께 조회될 때, 원자적 업데이트가 필요할 때 사용
2. 참조(Referencing) - '정규화' 모델
- 정의 : 관련된 데이터를 별도의 문서로 분리하고, 주 문서에 해당 문서의 _id를 참조하는 방식이다. SQL의 외래키와 유사하다.
- One to Many, Many to Many, 데이터를 분리하여 읽을 때, 자주 변경되는 데이터, 공유 데이터 등일때 사용
MongoDB 데이터 모델링 시 고려 사항
- 쿼리 패턴 : 애플리케이션에서 어떤 데이터가 가장 자주 함께 조회되는가? 데이터를 어떻게 사용할지에 따라 모델링을 최적화 해야한다.
- 데이터 크기 및 변화율 : 필드의 예상 크기와 변경 빈도
- 성능 목표 : 읽기 성능이 중요한지, 쓰기 성능이 중요한지
- 데이터 일관성 요구사항 : 관련된 데이터가 항상 엄격하게 일관되어야 하는지
- 샤딩 : 미래에 데이터를 분산해야 할 경우를 대비하여 샤드키를 고려
** 샤딩 : 데이터베이스의 수평적 확장을 위한 기술, 대규모의 데이터를 여러 개의 작은 조각으로 나누어 여러대의 서버에 분산 저장하는 기술이다.
샤딩을 사용하는 이유
- 데이터 용량 한계 극복 : 한 대의 서버가 처리할 수 있는 데이터 양이나 저장공간에는 한계가 있다. 이 한계를 넘기 위함이다.
- 성능 향상 : 데이터가 분산되어 저장되므로 쿼리, 쓰기 작업이 서버에 분산되어 처리되기 때문에 전반적인 성능이 향상된다.
- 고가용성 : 한 서버에 문제가 생기더라도, 다른 샤드에 있는 데이터는 계속 서비스 될 수 있기에 안정성이 높아진다.
총정리 : MongoDB 데이터 모델링은 정답이 있는 것이 아니라, 애플리케이션의 특정 요구사항에 따라 가장 효율적인 방법을 찾아나가는 유연하고 반복적인 과정이다. 처음부터 완벽한 모델을 찾기 보다, 핵심 기능을 기반으로 시작하고 필요에 따라 개선해 나가는 접근 방식이 일반적이다.
'공부 > DB' 카테고리의 다른 글
몽고DB에 문서 대량 삽입하기 (3) | 2025.08.06 |
---|---|
MongoDB 3장 (4) | 2025.07.31 |
MongoDB 2장 (3) | 2025.07.30 |
MongoDB 1장 (1) | 2025.07.28 |