최원종의 개발 블로그

관계 차수 - 13 본문

MySQL

관계 차수 - 13

chl6698 2026. 4. 4. 12:45

관계 차수 : 두 테이블이 서로 어떤 방식으로 연결되어 있는지를 나타냄.

관계 설명 실생활 예시
1:1 (일대일) A 하나 = B 하나 사람 ↔ 여권
1:N (일대다) A 하나 = B 여러 개 고객 ↔ 주문
N:M (다대다) A 여러 개 = B 여러 개 학생 ↔ 수업

 


1:1 관계 ( 한 명의 회원은 하나의 배송지만 등록할 수 있다고 가정)

member 테이블

id (PK)   name
1 홍길동
2 김영희

 


member_address 테이블

id (PK) member_id (FK, UNIQUE) address
10 1 서울시 강남구 역삼동
11 2 부산시 해운대구

 

 


FK 컬럼에 UNIQUE를 붙이면 1:1 관계가 됨

USE shop;

select * from member; 
desc member;

CREATE TABLE member_address (
    id        INT          PRIMARY KEY AUTO_INCREMENT,
    address   VARCHAR(200) NOT NULL,
    member_id bigint          UNIQUE,    -- UNIQUE = 1:1 설정
    FOREIGN KEY (member_id) REFERENCES member(id)
);

INSERT INTO member_address (address, member_id) VALUES
('서울시 강남구 역삼동', 1),
('부산시 해운대구', 2);


select * from member_address;

 


1:N 관계

한 명의 회원이 여러 개의 주문을 할 수 있습니다. shop DB의 member ↔ orders 관계가 바로 1:N

 

member 테이블

id (PK)   name
1 홍길동
2 김영희

 

 

orders 테이블 

id (PK) member_id (FK) total_price status 비고
1 1 1,200,000 배송완료 홍길동 주문 1
2 1 35,000 배송중 홍길동 주문 2
3 2 1,500,000 배송완료 김영희 주문 1

 

백엔드에서 1:N 이 가장 많이 나오는 패턴:
  회원(1) : 주문(N)
  게시글(1) : 댓글(N)
  카테고리(1) : 상품(N)
  주문(1) : 주문상세(N)

 


N:M 관계

shop DB 에서 한 주문에 여러 상품이 포함될 수 있고, 하나의 상품이 여러 주문에 포함될 수 있다

 

N:M을 직접 표현할 수 없는 이유

하나의 컬럼에 여러 값을 저장할 수 없습니다.

orders 테이블에 product_ids 컬럼을 만들어서
"1,2,3" 처럼 저장하면?
  → 특정 상품이 포함된 주문을 찾기 불가능
  → 상품 수량을 저장할 방법 없음
  → 관계형 DB 의 규칙 위반

 


해결 방법(중간 테이블 사용)

orders (주문)

| id | member_id | total_price |
|----|-----------|-------------|
|  1 |     1     |  1235000    |

products (상품)
| id | name         | price   |
|----|--------------|---------|
|  1 | 갤럭시 S24   | 1200000 |
|  7 | 자바 완전정복 |   35000 |

order_item (중간 테이블)
| id | order_id | product_id | quantity | price   |
|----|----------|------------|----------|---------|
|  1 |    1     |     1      |    1     | 1200000 |
|  2 |    1     |     7      |    1     |   35000 |

← 주문 1번에 상품 2개가 포함됨

 


핵심 요약

1:1 관계
  FK 에 UNIQUE 추가
  예: member ↔ member_address

1:N 관계
  FK 는 N 쪽 테이블에 위치
  예: member(1) ↔ orders(N)
  백엔드에서 가장 많이 사용

N:M 관계
  중간 테이블(교차 테이블) 필요
  예: orders ↔ order_item ↔ product
  중간 테이블에 두 FK + 추가 정보(수량, 가격 등) 저장

'MySQL' 카테고리의 다른 글

MySQL JOIN - 15  (0) 2026.04.04
ERD 다이어그램 - 14  (0) 2026.04.04
MySQL 기초 복습 - 12  (0) 2026.04.03
인덱스(Index) - 11  (0) 2026.04.03
PRIMARY KEY, UNIQUE, FOREIGN KEY - 10  (0) 2026.04.03