<aside> 📖
학습 목표
관계 정의는 데이터베이스 설계에서 서로 다른 엔티티 간의 상호작용 구조를 명시하는 단계입니다. 단순히 연결만 하는 것이 아니라, 관계의 방향성, 수, 필수 여부까지 고려해야 정확한 스키마로 이어질 수 있습니다.
엔티티 간 관계는 ***카디널리티(Cardinality)***에 따라 크게 다음 3가지로 나뉩니다:
| 관계 유형 | 설명 | 예시 |
|---|---|---|
| 1:1 | 한 개체는 하나의 개체와만 관계를 가짐 | 사용자 ↔️ 주민등록증 |
| 1:N | 한 개체는 여러 개체와 관계를 맺을 수 있음 | 사용자 → 주문 (사용자는 여러 주문을 할 수 있음) |
| N:M | 다수의 개체가 다수와 관계를 맺음 | 학생 ↔️ 과목 (한 학생이 여러 과목을 듣고, 과목도 여러 학생이 수강) |
<aside> 🙋🏻♀️
**카디널리티(Cardinality)**는 관계에 참여하는 엔티티의 인스턴스 개수를 제한합니다. 정확한 카디널리티 지정은 정규화와 성능 모두에 영향을 줍니다.
</aside>
관계 정의 시 해당 관계가 "항상 존재해야 하는지(필수)" 또는 "존재할 수도, 없을 수도 있는지(선택)"를 판단해야 합니다.
| 속성 | 설명 | 예시 |
|---|---|---|
| 필수 관계 | 관계가 반드시 존재해야 함 | 직원은 반드시 하나의 부서에 속해야 한다 |
| 선택 관계 | 관계가 없을 수도 있음 | 사용자는 꼭 프로필 사진을 등록하지 않아도 된다 |
-- 필수 관계를 반영하는 예시 (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) -- 있어도 되고 없어도 됨
);
ERD(Entity-Relationship Diagram)에서 관계는 다음과 같은 기호와 표현 방식으로 정의됩니다:
[User] 1 ───────< N [Order] => 한 사용자가 여러 주문
[Student] N ───────< N [Course] => 다대다 관계 (중간 엔티티 필요)
*중간 테이블(연결 엔티티)***을 반드시 둡니다.-- 다대다 관계 구현 예시: 학생과 과목
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)
);
| 고려 요소 | 설명 |
|---|---|
| 관계 방향성 | 양방향 or 단방향인지? → JPA에서도 양방향 매핑에 영향 |
| 관계 제약 조건 | 삭제 시 제약(ON DELETE CASCADE 등)을 설정해야 무결성 보장 |
| 연결 테이블 필요 여부 | N:M 관계면 중간 테이블을 정의해 추가 속성(예: 등록일자, 상태 등)을 저장할 수 있어야 함 |
| 성능 고려 | 관계가 너무 많으면 조인 비용 증가 → 인덱스 설정, 조회 분리 전략 필요 |