MongoDB 데이터 모델링

데이터 구조

앞서 이야기 했듯이 MongoDB Document는 정형화 되어있지 않고 다양한 모습을 띈다.
(‘MongoDB는 스키마를 정하지 못하는 것’은 아니다. MongoDB 역시 스키마를 미리 만들고 조건을 지정해 줄 수 있다.
다만 이는 RDBMS처럼 데이터베이스 서버측에서 만드는 스키마가 아니라 웹서버가 DB에 있는 문서들을 객체화해서 사용 할 수 있도록 설정해주는 것이다.)

따라 모델링 역시 서버에서 정형화되게 고유 구조만을 고려하기 보다는
애플리케이션이 해당 데이터를 어떻게 사용할지,
성능 특성 및 데이터 검색 패턴을 미리 고려해 균형을 맞추는 것이 좋다

데이터 관계

모델링을 설계하기 전 우리는 세가지 경우의 수를 미리 고려해야 한다

  1. One-to-One
    • 1:1로 하나의 엔티티가 다른 하나의 엔티티에 연결되는 관계

  2. One-to-Many
    • 하나의 엔티티가 다른 임의의 수의 데이터 엔티티에 연결되는
    • 예시로 key의 값으로 중첩된 배열을 사용하는 관계

  3. Many-to-Many
    • 임의의 수의 데이터가 다른 임의의 수 데이터에 연결되는 관계
  • One-to-Many와 Many-to-Many 같이 다수의 수를 참조 할 때 MongoDB는 두가지 기본적인 방법을 사용함
    Embedding / Referencing

Embedding

  • 관련 데이터를 가져와 문서에 삽입하는 방식
  • 데이터 반정규화와 유사
  • 함께 엑세스 되는 데이터를 조회 또는 저장할때 유용
  • 데이터를 한번에 사용할 경우가 많을때 한번의 실행으로 가능하기에 빠른 퍼포먼스
  • 데이터의 중복이 많아지면 메모리를 많이 사용
  • 매번 모든 데이터가 필요없는 경우가 많을 때 불필요하게 큰 파일 크기
{
	"_id" : ObjectId("573a1390f29313caabcf413b"),
	"title" : "test",
	"cast" : [
		{"actor" : "actor1", "character" : "character1},
		{"actor" : "actor2", "character" : "character2},
		{"actor" : "actor3", "character" : "character3},
		...
	]
}

Referencing

  • 다른 콜렉션의 문서를 참조하는 방식
  • 데이터 정규화와 유사
  • 변화가 잦을때 데이터의 일관성을 유지하기에 유용
  • 문서의 크기를 작게 관리 할 수 있음
  • 한번의 요청만으로 데이터를 불러올 수 없기에 퍼포먼스면에서 불리
  • 다중 저장, 작업으로 추가 자원 및 읽기 성능에 비용이 발생할 수 있음
{
	"_id" : ObjectId("573a1390f29313caabcf413b")
	"title" : "test"
	"cast" : [
		ObjectId("654a1420f29313fggbwo718"),
		ObjectId("654a1420f29313fggbwo719"),
		...
	]
}
  • 따라서 무엇이 좋다 우열을 가릴 수 있는 것은 아니며 실제 서비스를 구현하는 환경 및 개발 인력, 서비스의 규모에 따라 고려해야 함



참고 : MongoDB 공식 사이트 ‘MongoDB Data Modeling Intro’ 가이드 영상

Updated: