본문 바로가기

TIL

[데이터베이스] One-to-Many와 Many-to-Many 관계

1. One-to-Many 관계 (1:N 관계)

One-to-Many 관계는 하나의 엔티티가 여러 개의 다른 엔티티와 연결될 수 있는 관계를 말합니다. 이 관계에서 "하나"에 해당하는 엔티티는 "다수"에 해당하는 엔티티의 부모 역할을 하며, "다수"는 자식 엔티티로 볼 수 있습니다.

1.1 주요 특징

  • 단방향성: 부모에서 자식으로의 명확한 방향성을 가집니다
  • 참조 무결성: 자식 레코드는 반드시 유효한 부모 레코드를 참조해야 합니다
  • CASCADE 동작: 부모 레코드 삭제 시 자식 레코드 처리 방식을 정의할 수 있습니다

1.2 예시와 구현

학교-학생 관계:

  • 하나의 학교(One)는 여러 명의 학생(Many)을 가질 수 있습니다
  • 반대로, 하나의 학생은 단일 학교에만 속합니다
CREATE TABLE School (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE Student (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    school_id INT,
    FOREIGN KEY (school_id) REFERENCES School(id)
);

 

2. Many-to-Many 관계 (N:N 관계)

Many-to-Many 관계는 두 엔티티가 서로 여러 개와 연결될 수 있는 관계입니다. 이 관계는 중간에 연결 테이블 (Junction Table 또는 Bridge Table)을 사용해서 구현합니다

2.1 주요 특징

  • 복합키 사용: 연결 테이블은 보통 두 테이블의 기본키를 조합한 복합키를 사용합니다
  • 추가 데이터 저장: 연결 테이블에 관계에 대한 추가 정보를 저장할 수 있습니다
  • 양방향 탐색: 양쪽 엔티티에서 서로를 조회할 수 있습니다

2.2 연결 테이블 설계 시 고려사항

  • 인덱스 설계: 효율적인 조회를 위한 적절한 인덱스 구성
  • 복합키 vs 단일키: 상황에 따른 적절한 키 전략 선택
  • CASCADE 정책: 레코드 삭제 시 연결 데이터 처리 방식 결정
CREATE TABLE Student (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE Class (
    id INT PRIMARY KEY,
    title VARCHAR(100)
);

CREATE TABLE Student_Class (
    student_id INT,
    class_id INT,
    enrollment_date DATE,
    grade VARCHAR(2),
    PRIMARY KEY (student_id, class_id),
    FOREIGN KEY (student_id) REFERENCES Student(id),
    FOREIGN KEY (class_id) REFERENCES Class(id)
);

 

3. 성능 고려사항

3.1 One-to-Many 관계에서의 성능 최적화

  • 인덱스 활용: 외래 키에 대한 적절한 인덱스 설정
  • 페이지네이션: 대량의 자식 레코드 조회 시 페이지네이션 구현
  • 조인 최적화: 필요한 경우에만 조인을 사용하고, 커버링 인덱스 활용

3.2 Many-to-Many 관계에서의 성능 최적화

  • 복합 인덱스: 자주 사용되는 조회 패턴에 맞는 복합 인덱스 설정
  • 배치 처리: 대량의 관계 데이터 처리 시 배치 작업 구현
  • 캐싱 전략: 자주 조회되는 관계 데이터에 대한 캐싱 구현

4. 관계 설계 시 주의사항

4.1 데이터 정합성 유지

  • 참조 무결성 제약조건 적절히 설정
  • 트랜잭션 관리 철저히 수행
  • 동시성 제어 메커니즘 구현

4.2 확장성 고려

  • 샤딩 가능성: 데이터 분산 저장 고려
  • 스키마 변경: 향후 스키마 변경 용이성 확보
  • 마이그레이션: 데이터 마이그레이션 계획 수립

결론

데이터베이스 관계 설계는 애플리케이션의 성능과 유지보수성에 직접적인 영향을 미치는 중요한 요소입니다. One-to-Many와 Many-to-Many 관계를 적절히 활용하여 데이터 모델을 설계하고, 성능과 확장성을 고려한 구현을 통해 안정적인 시스템을 구축할 수 있습니다.