DB/MongoDB

[MongoDB] 몽고디비 데이터 관계 모델링 Reference VS Embedding

  • -
몽고디비에서 관계 매핑을 위해 사용되는 참조와 임베딩 방식의 특징과 차이를 정리한 글입니다.

 

참조 (Reference)

몽고디비에서는 관계 매핑을 위해 참조(Reference)와 임베딩(Embedding) 방식을 사용합니다.

 

먼저, 참조 방식에 대해 알아보겠습니다. 

참조는 다른 컬렉션의 문서를 참조하는 방식입니다. 가령, 'users'와 'teams'라는 두 개의 컬렉션이 있을 때 users와 teams는 n:1 관계입니다. (유저는 무조건 하나의 팀에 속해있고, 팀은 여러 유저가 소속되어 있는 관계)

 

이 관계를 참조 방식으로 매핑하여 나타낸 예시입니다.

// users 컬렉션
{
    "_id": ObjectId("user_id"),
    "username": "example_user",
    "email": "user@example.com",
    "team": ObjectId("team_id")
}

// teams 컬렉션
{
    "_id": ObjectId("team_id"),
    "team_name": "Team A"
}

 

users가 teams의 id를 참조하여 관계를 매핑할 수 있습니다.

관계형 데이터베이스의 외래키(Foreign Key)와 유사합니다.

 

참조 방법의 장점으로는 다음과 같습니다.

  • 데이터의 중복을 피할 수 있어 저장 공간을 절약할 수 있다.
  • 관련 데이터를 변경할 때 하나의 도큐먼트만 업데이트 하면 되므로 데이터의 일관성을 유지하기 쉽다.
  • 참조된 데이터가 여러 문서에서 공유될 수 있기 때문에 관련 정보를 한 번만 업데이트하면 된다.

참조 방법의 단점은 다음과 같습니다.

  • 데이터를 조회할 때 마다 참조된 데이터를 추가로 가져와야 하므로 조회 작업에서 성능 저하가 발생할 수 있다.
  • 여러 컬렉션을 조인해야 하는 경우에 복잡해 질 수 있다.

 

임베딩 (Embedding)

임베딩은 도큐먼트 안에 다른 도큐먼트를 통째로 포함시키는 방식입니다. 

 

team 필드 안에 team의 정보가 모두 포함되어 있습니다.

// users 컬렉션
{
    "_id": ObjectId("user_id"),
    "username": "example_user",
    "email": "user@example.com",
    "team": {
        "_id": ObjectId("team_id"),
        "team_name": "Team A"
    }
}

// teams 컬렉션
{
    "_id": ObjectId("team_id"),
    "team_name": "Team A"
}

 

임베딩 방법의 장점으로는 다음과 같습니다.

  • 관계된 데이터를 한 번의 조회로 가져올 수 있어 성능이 향상될 수 있다.
  • 여러 문서를 변경할 필요 없이 관련 정보를 함께 업데이트 할 수 있다.

임베딩 방식의 단점은 다음과 같습니다.

  • 중복된 데이터가 발생해 저장 공간을 더 많이 차지할 수 있다.
  • 데이터의 일관성을 유지하기 어렵다
    • 업데이트 작업이 발생할 때 참조된 데이터를 모두 업데이트 해야한다.

 

어떤 방법이 더 좋을까?

 

참조 방법은 데이터 일관성과 중복을 피하고자 사용됩니다. 임베딩 방법은 성능이 중요한 경우나 데이터의 구조가 서로 강하게 결합되어 있을 사용됩니다. 프로젝트의 특정 요구사항, 읽기 또는 쓰기 작업의 빈도 등을 고려하여 적절한 방법을 선택해야 합니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.