개발

Many to Many Relations

belljun 2025. 5. 19. 00:03

다대다(M:N) 관계란 두 개의 엔티티 A와 B 사이의 관계를 의미하며, A의 하나의 인스턴스가 B의 여러 인스턴스와 관계될 수 있고, 반대로 B의 하나의 인스턴스도 A의 여러 인스턴스와 관련될 수 있는 관계를 말한다.

RDBMS에서는 이런한 관계를 구현할 때 보통 연관 테이블을 사용한다. 이 테이블은 아래와 같은 이름으로 불리기도 한다.

  • 조인 테이블
  • 연결 테이블
  • 교차 테이블

 

예를 들어 AB라는 연관 테이블을 만든다면 A -> AB, B -> AB 이렇게 두 개의 일대다(1:N) 관계로 다대다 관계를 풀어낸다. 이 경우 AB 테이블의 논리적 기본 키는 A와 B의 외래 키 두 개로 구성된다.

 

다대다 관계 문제

중복 데이터와 정합성

다대다 관계를 중간 테이블 없이 직접 모델링하면, 동일한 정보가 여러 테이블 또는 행에 반복적으로 나타날 수 있다. 이에 데이터 중복이 발생할 뿐아니라 하나만 수정해도 다른 행과 값이 달라지는 정합성 문제도 발생할 수 있다.

 

표현력 부족

단순히 두 테이블을 외래 키로 연결하면, 관계 자체에 대한 속성을 표현할 수 없다. 연관 테이블을 통해 관계뿐만 아니라 속성에 대한 기록을 함께 저장할 수 있다.

 

복잡한 쿼리와 성능

다대다 관계는 일반적으로 두 번 이상의 조인이 필요하다.

 

무결성 문제

외래 키 제약을 잘못 설계하면 삭제/수정 시 참조 무결성 오류가 발생할 수 있다.

 

관계 방향과 관리 책임

A와 B의 관계에서, 어느 쪽이 관계를 소유해야 할지 모호하다. 양방향 관계 설정 시 무한 루프 문제도 발생할 수 있다.

 

DB 관점에서 다대다 관계

RDBMS

RDBMS에서 다대다 관계는 연관 테이블을 통해 구현된다. 정규화된 데이터 모델링에 적합하며, 정합성 유지와 조인 쿼리에 강점을 가진다.

 

NoSQL

다대다 관계를 직접적으로 지원하고 있지 않다. 직접 구현은 가능하지만, 중복 데이터와 정합성 문제가 발생할 수 있다. 대신 조회 성능을 위해 일부 중복을 감수하고 비정규화 구조로 사용 가능하다.

 

Graph DB

그래프 데이터베이스는 노드와 간선을 통해 모든 관계를 직접 연결된 형태로 저장한다. 이에 "누가 누구를 통해 누구와 연결되는가?" 같은 다단계 탐색 쿼리에 적합하다.