<aside> 📖

학습 목표

1. 엔티티 간 관계 정의

관계 정의는 데이터베이스 설계에서 서로 다른 엔티티 간의 상호작용 구조를 명시하는 단계입니다. 단순히 연결만 하는 것이 아니라, 관계의 방향성, 수, 필수 여부까지 고려해야 정확한 스키마로 이어질 수 있습니다.

1-1. 관계의 기본 유형

엔티티 간 관계는 ***카디널리티(Cardinality)***에 따라 크게 다음 3가지로 나뉩니다:

관계 유형 설명 예시
1:1 한 개체는 하나의 개체와만 관계를 가짐 사용자 ↔️ 주민등록증
1:N 한 개체는 여러 개체와 관계를 맺을 수 있음 사용자 → 주문 (사용자는 여러 주문을 할 수 있음)
N:M 다수의 개체가 다수와 관계를 맺음 학생 ↔️ 과목 (한 학생이 여러 과목을 듣고, 과목도 여러 학생이 수강)

<aside> 🙋🏻‍♀️

**카디널리티(Cardinality)**는 관계에 참여하는 엔티티의 인스턴스 개수를 제한합니다. 정확한 카디널리티 지정은 정규화와 성능 모두에 영향을 줍니다.

</aside>

1-2. 관계의 필수성과 선택성

관계 정의 시 해당 관계가 "항상 존재해야 하는지(필수)" 또는 "존재할 수도, 없을 수도 있는지(선택)"를 판단해야 합니다.

속성 설명 예시
필수 관계 관계가 반드시 존재해야 함 직원은 반드시 하나의 부서에 속해야 한다
선택 관계 관계가 없을 수도 있음 사용자는 꼭 프로필 사진을 등록하지 않아도 된다
-- 필수 관계를 반영하는 예시 (NOT NULL 외래키)
CREATE TABLE employees (
    employee_id SERIAL PRIMARY KEY,
    department_id INTEGER NOT NULL REFERENCES departments(department_id) -- 반드시 부서 소속
);

-- 선택 관계 (NULL 허용 외래키)
CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    profile_image_id INTEGER REFERENCES images(image_id) -- 있어도 되고 없어도 됨
);

1-3. 관계 표현 방식 (ERD)

ERD(Entity-Relationship Diagram)에서 관계는 다음과 같은 기호와 표현 방식으로 정의됩니다:

[User] 1 ───────< N [Order]     => 한 사용자가 여러 주문
[Student] N ───────< N [Course] => 다대다 관계 (중간 엔티티 필요)

N:M 관계는 실제 테이블로 구현할 때 ***중간 테이블(연결 엔티티)***을 반드시 둡니다.

-- 다대다 관계 구현 예시: 학생과 과목
CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,
    title VARCHAR(100)
);

CREATE TABLE student_courses (
    student_id INTEGER REFERENCES students(student_id),
    course_id INTEGER REFERENCES courses(course_id),
    enrolled_at TIMESTAMP DEFAULT now(),
    PRIMARY KEY (student_id, course_id)
);

1-4. 관계 설계 시 고려할 사항

고려 요소 설명
관계 방향성 양방향 or 단방향인지? → JPA에서도 양방향 매핑에 영향
관계 제약 조건 삭제 시 제약(ON DELETE CASCADE 등)을 설정해야 무결성 보장
연결 테이블 필요 여부 N:M 관계면 중간 테이블을 정의해 추가 속성(예: 등록일자, 상태 등)을 저장할 수 있어야 함
성능 고려 관계가 너무 많으면 조인 비용 증가 → 인덱스 설정, 조회 분리 전략 필요

실무 팁