최원종의 개발 블로그

데이터베이스 설계 시나리오 본문

MySQL

데이터베이스 설계 시나리오

chl6698 2026. 4. 2. 11:32

쇼핑몰 시나리오

 

1. 테이블 하나에 다 넣기

| 회원명 | 회원주소       | 상품명  | 가격   | 수량 |
|--------|--------------|---------|--------|------|
| 김철수  | 서울 강남구   | 노트북   | 150만원 | 1  |
| 김철수  | 서울 강남구   | 마우스   | 3만원  | 2   |
| 김철수  | 서울 강남구   | 키보드   | 8만원  | 1   |
| 이영희  | 부산 해운대   | 노트북   | 150만원 | 1  |

 

문제점

1. 김철수의 주소가 3번 중복됩니다 → 데이터 낭비
2. 김철수가 이사를 가면 3줄을 모두 수정해야 합니다 → 누락 위험
3. 같은 상품 정보(노트북, 150만원)가 여러 번 반복됩니다 → 중복
4. 상품 가격이 바뀌면 모든 과거 주문 행도 바꿔야 합니다 → 불일치

 

2. 테이블을 분리해서 중복 제거

문제의 핵심은 서로 다른 종류의 데이터가 한 테이블에 섞여 있다는 것

 

회원 정보 → 회원 테이블
상품 정보 → 상품 테이블
주문 정보 → 주문 테이블

 

분리 후

member 테이블:
| id(PK) | name   | address    |
|--------|--------|------------|
|   1    | 김철수  | 서울 강남구 |
|   2    | 이영희  | 부산 해운대 |

product 테이블:
| id(PK) | name  | price    |
|--------|-------|----------|
|   1    | 노트북 | 1500000 |
|   2    | 마우스 | 30000   |
|   3    | 키보드 | 80000   |

orders 테이블:
| id(PK) | member_id(FK) | product_id(FK) | quantity |
|--------|--------------|----------------|----------|
|   1    |      1       |       1        |    1     |
|   2    |      1       |       2        |    2     |
|   3    |      1       |       3        |    1     |
|   4    |      2       |       1        |    1     |

3. PK와 FK 관계

PK (Primary Key): 테이블에서 각 행을 고유하게 식별
  → member.id = 1 인 회원은 단 한 명

FK (Foreign Key): 다른 테이블의 PK 를 참조
  → orders.member_id = 1 은 member.id = 1 (김철수) 을 가리킴
  → orders.product_id = 1 은 product.id = 1 (노트북) 을 가리킴

이 구조를 1:N (일대다) 관계 라고 함

현실 세계에서 가장 많이 쓰이는 관계:
  회원(1)    : 주문(N)  → 회원 1명이 여러 주문 가능
  게시글(1)  : 댓글(N) → 게시글 1개에 여러 댓글
  학생(1) :   성적(N)  → 학생 1명이 여러 과목 점수 보유

데이터베이스 구축 절차

구축 절차:
  1. 데이터베이스 생성  (CREATE DATABASE)
  2. 사용할 DB 선택    (USE)
  3. 테이블 설계 및 생성 (CREATE TABLE)
  4. 데이터 입력       (INSERT)
  5. 데이터 조회       (SELECT)

 


실습 코드

-- 데이터 베이스 구축하기 
CREATE DATABASE school;
-- 어떤 데이터베이스를 사용하겠다.  
use school;

-- 테이블 생성 

-- 1. 학생 테이블 
CREATE TABLE student(
	student_id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL, 
  grade INT NOT NULL, 
  major VARCHAR(50) NOT NULL, 
  phone VARCHAR(20)
);

select * from student;

-- 2. 과목 테이블 
CREATE TABLE subject(
	subject_id INT PRIMARY KEY, 
  subject_name VARCHAR(50) NOT NULL, 
  credit INT NOT NULL, 
  professor VARCHAR(30) NOT NULL
);

-- 수강 테이블 (student 테이블 subject 테이블 연결) -> FK 
CREATE TABLE enrollment(
	enrollment_id INT PRIMARY KEY, 
  student_id INT NOT NULL, -- 일적으로 FK를 선언시 not null로 설정 함 
	subject_id int not null,
  score      DEcIMAL(5, 2),
  enrolLED_AT DATe NOt null, 
  foreIGN kEY(student_id) REFERENcES Student(student_id),
  foreigN key(subject_id) REFERENcES Subject(subject_id)
);

-- 테이블 목록 확인 
show tables;

데이터 넣기

-- 테이블 삭제 방법 
-- drop table student; 
-- drop table subject;
-- drop table enrollment;

-- 학생 데이터
INSERT INTO student (student_id, name, grade, major, phone) VALUES
(1001, '김철수', 2, '컴퓨터공학', '010-1234-5678'),
(1002, '이영희', 3, '경영학',     '010-2345-6789'),
(1003, '박민준', 1, '전자공학',   '010-3456-7890'),
(1004, '최지아', 4, '컴퓨터공학', '010-4567-8901'),
(1005, '한수연', 2, '경영학',     NULL);

-- 과목 데이터
INSERT INTO subject (subject_id, subject_name, credit, professor) VALUES
(101, '데이터베이스', 3, '김교수'),
(102, '알고리즘',    3, '이교수'),
(103, '웹프로그래밍', 2, '박교수'),
(104, '운영체제',    3, '최교수');

-- 수강 데이터
INSERT INTO enrollment (enrollment_id, student_id, subject_id, score, enrolled_at) VALUES
(1, 1001, 101, 88.5,  '2026-03-02'),
(2, 1001, 102, 92.0,  '2026-03-02'),
(3, 1002, 101, 75.0,  '2024-03-02'),
(4, 1002, 103, 85.5,  '2024-03-02'),
(5, 1003, 102, 90.0,  '2024-03-02'),
(6, 1004, 101, 95.0,  '2024-03-02'),
(7, 1004, 104, 78.0,  '2024-03-02'),
(8, 1005, 103, NULL,  '2024-03-02');

-- 데이터 확인
SELECT * FROM student;
SELECT * FROM subject;
SELECT * FROM enrollment;

핵심 요약

테이블 설계 원칙
  서로 다른 종류의 데이터 → 테이블 분리
  각 테이블에 PK 설정 → 행을 고유하게 식별
  테이블 간 관계 → FK 로 연결

1:N 관계
  가장 많이 쓰이는 관계
  FK 는 N 쪽 테이블에 위치

DB 구축 순서
  CREATE DATABASE → USE → CREATE TABLE → INSERT → SELECT

'MySQL' 카테고리의 다른 글

INSERT 구문과 제약 조건 -7  (0) 2026.04.02
MySQL 데이터 타입 - 6  (0) 2026.04.02
SQL - DDL, DML, DCL -5  (0) 2026.04.02
데이터베이스란?  (0) 2026.04.02
데이터와 정보  (0) 2026.04.01