2025/09/03 Database -3

김기훈·2025년 9월 4일

TIL

목록 보기
13/194

Relationship 유형 Cardinality

1:1 (One-to-One)

  • 의미: 한쪽 레코드가 다른 쪽 레코드와 딱 하나만 연결됨.
  • 예시: 사람 ↔ 주민등록증
    • 한 사람은 주민등록증을 하나만 가짐.
      • 한 주민등록증은 한 사람에게만 속함.
  • SQL 구현: UNIQUE 제약조건이나 PRIMARY KEY와 FOREIGN KEY를 함께 사용.
CREATE TABLE Person (
    person_id INT PRIMARY KEY,
    name VARCHAR(50)
);

CREATE TABLE IDCard (
    card_id INT PRIMARY KEY,
    person_id INT UNIQUE, -- 한 사람당 한 카드만
    FOREIGN KEY (person_id) REFERENCES Person(person_id)
);

1:N (One-to-Many)

  • 의미: 한쪽 레코드가 다른 쪽의 여러 개와 연결됨.
  • 예시: 고객 ↔ 주문
    • 한 고객은 여러 주문을 할 수 있음.
      • 하지만 한 주문은 특정 고객에 속함.
  • SQL 구현: N 쪽에 FOREIGN KEY를 둠.
CREATE TABLE Customer (
    customer_id INT PRIMARY KEY,
    name VARCHAR(50)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)
);

N:1 (Many-to-One)

  • 의미: 사실상 1:N의 반대 관점.
  • 예시: 주문 ↔ 고객
    • 여러 주문이 하나의 고객에 속함.
      • 즉, 주문 입장에서 보면 "Many-to-One" 관계.
  • SQL 구현: 동일하게 FOREIGN KEY 사용 (관점을 어디에 두느냐 차이).

N:N (Many-to-Many)

  • 의미: 양쪽 레코드 모두 서로 여러 개와 연결 가능.
  • 예시: 학생 ↔ 강좌
    • 한 학생은 여러 강좌를 수강할 수 있음.
      • 한 강좌에도 여러 학생이 참여 가능.
  • SQL 구현: 중간 테이블(조인 테이블) 필요
CREATE TABLE Student (
    student_id INT PRIMARY KEY,
    name VARCHAR(50)
);

CREATE TABLE Course (
    course_id INT PRIMARY KEY,
    title VARCHAR(50)
);

-- 관계 테이블 (중간 테이블)
CREATE TABLE StudentCourse (
    student_id INT,
    course_id INT,
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES Student(student_id),
    FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
-------------------------------------------------------------
# 사용
-- 학생 추가
INSERT INTO Student (student_id, name) VALUES
(1, '철수'),
(2, '영희'),
(3, '민수');

-- 강좌 추가
INSERT INTO Course (course_id, title) VALUES
(101, '데이터베이스'),
(102, '파이썬'),
(103, '알고리즘');
-------------------------------------------------------------
-- 철수(1)는 데이터베이스(101)와 파이썬(102) 수강
INSERT INTO StudentCourse (student_id, course_id) VALUES
(1, 101),
(1, 102);

-- 영희(2)는 파이썬(102), 알고리즘(103) 수강
INSERT INTO StudentCourse (student_id, course_id) VALUES
(2, 102),
(2, 103);

-- 민수(3)는 데이터베이스(101)만 수강
INSERT INTO StudentCourse (student_id, course_id) VALUES
(3, 101);
-------------------------------------------------------------
# 데이터 확인
SELECT * FROM Student;
SELECT * FROM Course;
SELECT * FROM StudentCourse;;
student_idname
1철수
2영희
3민수
course_idtitle
101데이터베이스
102파이썬
103알고리즘
student_idcourse_id
1101
1102
2102
2103
3101

총정리

  • 1:1 → UNIQUE + FOREIGN KEY
  • 1:N / N:1 → N 쪽에 FOREIGN KEY
  • M:N → 중간 테이블로 분리

ERD

profile
안녕하세요.

0개의 댓글