자기 참조 관계

2025. 1. 3. 21:40·DB

📌 자기 참조 관계? 그게 왜 필요한데?

🤔  ERD 설계를 하던 와중 계층형 관계에 부딪히게 되었습니다.

계층형 구조를 가진 카테고리에 대해서 계층 정보를 저장해야 하는데 가장 처음 떠오른 방법은 매핑 테이블이었습니다. 그런데 카테고리의 수가 많지 않고 그 몇 개의 카테고리의 계층 관계를 저장하기 위해서 매핑 테이블을 따로 만들자니 굉장히 비효율적이라고 생각했습니다.

예를 들어서,
회원이라는 엔티티가 있다고 생각해 봅시다. 각 회원은 자신을 추천해준 추천인을 입력할 수 있다고 생각해봅시다. 애플리케이션의 유저가 늘어날수록 회원의 수가 늘어나고 추천인에 대한 구조를 나중에 계층을 정리해서 확인하고 싶다면 매핑 테이블을 따로 만드는 것은 타당하다고 생각됩니다.

이번에는 옷 쇼핑몰을  설계해 본다고 생각해 봅시다. 옷에 대한 엔티티가 있고 모든 옷은 옷의 분류인 카테고리가 존재합니다. 예를 들어, 상의 아래에는 재킷과 셔츠가 존재할 수 있습니다. 옷 쇼핑몰 같은 경우에는 분류체계가 크게 바뀔 일이 없고 체계도 많이 세분화되어 있지 않습니다. 

이런 경우 매핑 테이블을 따로 만드는 것이 좋을까요❓
이와 같은 경우에 사용하기 좋은 것이 자기 참조 관계입니다.

📌 자기 참조 관계란?

자기 참조 관계는 하나의 테이블이 자신의 데이터를 참조하는 관계를 의미합니다. 즉, 테이블의 한 칼럼이 같은 테이블의 다른 레코드(또는 자신의 레코드)를 외래 키(Foreign Key)로 참조합니다.

특징

  • 데이터의 계층 구조나 연결 관계를 모델링할 때 유용합니다
  • 동일한 테이블 내에서 부모-자식 관계를 정의할 수 있습니다.

자기 참조 관계는 3가지로 분류할 수 있습니다. 

✅ 1:1 자기 참조 관계

✅ 1:N 자기 참조 관계

✅ N:M 자기 참조 관계

🧐 사실 자기 참조의 개념 자체는 크게 어렵지 않습니다.

하지만 중요한 것은,
어떤 경우에 매핑 테이블을 사용하고 어떤 경우에 자기 참조를 사용하는지입니다.

 

📌 자기 참조 VS 매핑 테이블

✅ 자기 참조

장점

  • 단일 테이블 내에서 계층 구조나 관계를 표현하므로 테이블 수가 적고 관리가 간단합니다.
  • 테이블 하나에서 삽입, 삭제, 수정이 이뤄지므로 편리하다.
  • 별도의 테이블이 필요가 없다.

단점

  • 계층적 데이터를 탐색하려면 재귀 쿼리(WITH RECURSIVE)가 필요하며, 성능 문제가 발생할 수 있다.:
  • 복잡한 관계나 다대다 관계에는 부적합하며, 데이터가 많아질수록 관리와 유지보수가 어려워질 수 있다.
  • 부모-자식 관계의 순환 참조(Circular Reference)를 방지해야 하며, 잘못된 관계 설정(예: 자기 자신을 부모로 참조)이 발생하지 않도록 해야 한다.
  1.  

✅ 매핑 테이블

장점

  • 다대다 관계를 표현할 수 있으므로 복잡한 관계에도 적합합니다.
  • 관계를 독립적으로 관리하기 때문에 데이터 무결성을 보다 철저히 유지할 수 있습니다.
  • 관계 테이블에 추가적인 메타데이터(예: 관계 유형, 생성일 등)를 저장할 수 있어 비즈니스 로직 확장에 유리합니다.

단점

  • 별도의 테이블을 추가 생성해야 함.
  • 추가적인 조인이 필요하기 때문에 대량의 데이터에 대해 성능 저하가 발생할 수 있다.
  • 데이터 삽입/삭제 시 여러 테이블을 동시에 관리해야 하므로 트랜잭션 관리가 중요하다.
🤔 이제 구체적으로 상황을 생각해 봅시다.

자기 참조의 가장 큰 장점은 편리하다는 것입니다. 새로운 테이블을 만들지 않아도 되기 때문에 여러 가지로 편리한 부분이 많습니다. 아래와 같은 상황에서는 매핑 테이블보다는 자기 참조를 사용할 것 같네요.

- 계층적 관계를 확인해야 할 일이 크게 없다(재귀 쿼리는 비효율적이에요).
ex) 추천인을 기록하는 경우, 나의 추천인 정도만 확인하면 괜찮다. 추천인들끼리의 위계를 정리하는 등 복잡한 과정이 필요 없다.

- 계층적 관계를 Row들이 많지 않다.
ex) 옷 쇼핑몰의 분류와 위계는 많지도 않고 바뀔 일도 크게 없습니다.

그런데 아래와 같은 조건이 붙게 된다면 자기 참조보다는 매핑 테이블을 사용할 것 같습니다.

- 관계에 추가적인 메타 데이터가 필요하다
ex) 회사에서 상사 관계를 표현하는데 어떤 관계인지 언제 정해졌는지 관계 자체 말고도 추가적인 메타 데이터가 필요한 경우

- 데이터의 개수가 많고 계층적 관계를 확인해야 할 일이 많다.

 

Reference:

티스토리 - 자기 참조 순환관계(Recursive Relationship) 🔗

 

'DB' 카테고리의 다른 글

[DB] 데이터베이스에는 어떤 종류가 있을까?  (3) 2024.12.31
'DB' 카테고리의 다른 글
  • [DB] 데이터베이스에는 어떤 종류가 있을까?
나는 정말 개발이 하고 싶었다
나는 정말 개발이 하고 싶었다
개발 혼자 공부하기
  • 나는 정말 개발이 하고 싶었다
    감자밭
    나는 정말 개발이 하고 싶었다
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • ETC (3)
      • 알고리즘 (0)
      • Java (0)
      • DB (2)
      • Spring (0)
      • 프로젝트 (18)
      • Server (3)
      • CS (0)
        • 운영체제 (0)
      • Infra (4)
        • IAC (1)
        • AWS (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • hELLO· Designed By정상우.v4.10.3
나는 정말 개발이 하고 싶었다
자기 참조 관계
상단으로

티스토리툴바