SQL에서는 데이터를 정의하고 조작하는 다양한 명령어들이 존재한다. 이 명령어들은 크게 DDL과 DML로 나눌 수 있다.
DDL은 데이터 구조를 정의하거나 변경할 때 사용하는 언어
CREATE: 테이블, 데이터베이스, 뷰 등을 새로 생성할 때 사용ALTER: 기존 객체(테이블 등)의 구조를 변경할 때 사용DROP: 객체를 삭제할 때 사용TRUNCATE: 테이블의 모든 데이터를 빠르게 삭제 (구조는 유지)⚠️ 참고: DDL은 실행 즉시 자동 커밋
DML은 데이터를 실제로 다루는 작업을 담당
SELECT: 데이터를 조회할 때 사용INSERT: 새로운 데이터를 추가할 때 사용UPDATE: 기존 데이터를 수정할 때 사용DELETE: 데이터를 삭제할 때 사용💡 DML은 트랜잭션을 지원하기 때문에
COMMIT,ROLLBACK과 함께 쓰는 경우가 많음
정규화는 데이터 중복을 줄이고 무결성을 높이기 위해 필요한 과정이다.
실제 운영 환경에서는 역정규화를 쓸 수도 있다.
📌 역정규화(denormalization)란?
정규화를 통해 나눠놓은 테이블을 다시 합치거나, 중복 데이터를 일부러 추가해서 조회 성능을 높이는 것.
데이터 중복을 감수하고, 조인 없이 빠르게 데이터를 읽기 위한 목적.
-- 사용자 테이블
CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(100)
);
-- 주문 테이블
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
product_name VARCHAR(100),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
-- 사용자 이름과 함께 주문 조회 (JOIN 필요)
SELECT o.order_id, u.username, o.product_name
FROM orders o
JOIN users u ON o.user_id = u.user_id;
→ 조인 필요함. 성능 이슈 발생 가능
-- 역정규화된 주문 테이블 (중복 허용)
CREATE TABLE orders_denorm (
order_id INT PRIMARY KEY,
user_id INT,
username VARCHAR(100), -- 사용자 이름 중복 저장
product_name VARCHAR(100)
);
-- 바로 조회 가능 (JOIN 없음)
SELECT order_id, username, product_name
FROM orders_denorm;
→ 조회 속도 빠름. 하지만 데이터 중복 생김
-- 정규화된 경우
UPDATE users SET username = '새이름' WHERE user_id = 1;
-- 역정규화된 경우
UPDATE orders_denorm SET username = '새이름' WHERE user_id = 1;
| 장점 | 단점 |
|---|---|
| 조회 속도 향상 | 데이터 중복 증가 |
| 조인 연산 감소 | 무결성 제약 어려움 |
| 시스템 부담 완화 | 유지보수 복잡도 증가 |
성능이 중요할 땐 역정규화 전략을 고려할 수 있다.