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 관계를 적절히 활용하여 데이터 모델을 설계하고, 성능과 확장성을 고려한 구현을 통해 안정적인 시스템을 구축할 수 있습니다.
'TIL' 카테고리의 다른 글
[코드트리 한달후기] 코드트리로 코딩 테스트 준비하기 (0) | 2025.02.05 |
---|---|
[Tailwind CSS] gap vs space 유틸리티의 차이점 이해하기 (0) | 2025.02.01 |
[nuqs 라이브러리] Nuqs 라이브러리 가이드: URL 쿼리 파라미터 관리와 최적화 (0) | 2024.12.24 |
[회고] 다사다난 했던 2024년도 회고 (1) | 2024.12.23 |
가챠권 소모 로직과 공정한 랜덤 확률 시스템 구현: 사용자 재방문율 20% 향상 (0) | 2024.12.17 |