테이블을 중복 없이 논리적으로 잘게 나누는 과정
| StudentID | Course |
|---|---|
| 123 | 컴퓨터구조, 자료구조, 이산수학 |
| StudentID | CourseID | Name |
|---|---|---|
| 123 | 456 | Peter Parker |
| StudentID | CourseID | Course |
|---|---|---|
| 123 | 456 | 컴퓨터구조 |
쿼리 성능이나 데이터 접근 편의성을 위해 일부 정규화를 깨는 것
검색 속도를 빠르게 하기 위해 특정 컬럼에 색인 구조를 만드는 것
CREATE INDEX idx_StudentID ON Students(StudentID);
대부분의 RDBMS 인덱스는 B-Tree 구조 사용
➡️ 정렬된 트리 형태로 데이터를 저장해 빠르게 이진 탐색 가능
모든 컬럼에 인덱스를 걸면 좋을 것 같지만 다음과 같은 문제점들이 발생
➡️ 실무에선 “조회 조건으로 자주 쓰는 컬럼만” 인덱스 설정
-- user_id에는 인덱스가 있음
SELECT name FROM users WHERE user_id = 'abc123';-- 복합 인덱스: (user_id, name)
SELECT name FROM users WHERE user_id = 'abc123';데이터의 무결성을 보장하기 위해 테이블 수준에서 제한을 거는 규칙
PRIMARY KEY 중복 불가능, 값이 NULL일 수 없음NOT NULL 값이 NULL일 수 없음UNIQUE 중복 불가능CHECK 값의 범위 제한FOREIGN KEY 다른 테이블과 참조 연결-- 제약 추가
ALTER TABLE Students ADD CONSTRAINT grade_range CHECK (Grade BETWEEN 1 AND 4);
-- 제약 삭제
ALTER TABLE Students DROP CHECK grade_range;
CREATE TABLE Students