데이터베이스/Database
[Primary Key] Primary Key가 없다면? 데이터 무결성과 성능에 미치는 영향
Dachaes
2025. 4. 14. 14:52
728x90
728x90
Primary Key(PK)
데이터베이스에서 테이블을 만들 때 거의 필수적으로 지정하는 것이 Primary Key(PK)입니다. 하지만 간혹 "PK 없이도 테이블은 잘 돌아가는데?"라는 생각으로 PK를 생략한 채 테이블을 설계하는 경우가 있습니다.
그렇다면 PK가 없는 테이블은 어떤 문제가 발생할 수 있을까요? 실제로 어떤 상황에서 심각한 영향을 미치는 걸까요? 이 글에서는 PK가 없는 테이블이 초래할 수 있는 문제점과, 왜 항상 PK를 지정해야 하는지에 대해 살펴봅니다.
1. Primary Key(PK)란?
Primary Key는 테이블에서 각 행(row)을 유일하게 식별할 수 있는 컬럼(또는 컬럼 조합)입니다.
- 유일성(UNIQUE) : 중복된 값이 없어야 합니다.
- NOT NULL : 반드시 값이 있어야 합니다.
- 자동 인덱싱 : PK에는 자동으로 인덱스가 생성됩니다.
예시
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
2. PK가 없으면 어떤 문제가 생길까?
a. 중복 데이터 발생
PK가 없으면 같은 데이터를 여러 번 입력할 수 있는 여지가 생깁니다.
-- 같은 데이터 여러 번 삽입
INSERT INTO users (name, email) VALUES ('홍길동', 'gil@example.com');
INSERT INTO users (name, email) VALUES ('홍길동', 'gil@example.com');
결과 :
| id | name | email |
|----|-------|-----------------|
| | 홍길동 | gil@example.com |
| | 홍길동 | gil@example.com |
이렇게 되면 정확한 조회, 통계, 업데이트/삭제 모두 어려워집니다.
b. UPDATE/DELETE가 어려움
PK가 없으면 특정 행을 정확하게 지정하기 어렵습니다.
-- 같은 조건이 여러 행에 해당하면?
DELETE FROM users WHERE name = '홍길동';
- 의도한 한 행만 삭제되지 않고, 여러 행이 삭제될 수 있습니다. 또는 반대로 DELETE 실패를 막기 위해 복잡한 조건을 추가해야 합니다.
c. 성능 저하
- PK에는 자동으로 인덱스가 생성되지만, PK가 없으면 인덱스가 없을 수 있습니다.
- 조회 속도가 느려지고, 테이블 스캔(Full Table Scan)이 발생합니다.
- 특히 JOIN 시, 어떤 기준으로 연결할지 애매해져서 성능에 치명적입니다.
d. ORM 등 도구 사용 시 문제
ORM(Object-Relational Mapping) 라이브러리는 대부분 PK를 기준으로 모델을 다룹니다.
예 : Sequelize, TypeORM, Hibernate, Django ORM 등
- PK가 없으면 ORM이 엔티티 추적이 불가능합니다.
- CRUD 자동 매핑이 깨지거나, 복잡한 수동 처리 코드가 필요해집니다.
3. 예외적으로 PK 없이 설계하는 경우는?
- 로그 테이블 : 단순히 기록만 남기고 수정/삭제하지 않는 테이블 (하지만 보통은 자동 증가 ID를 PK로 둡니다)
- 임시 캐시 테이블 : 일정 시간 지나면 사라지는 데이터 저장소
- 뷰(View) : 물리적인 테이블이 아니므로 PK 개념이 없음
하지만 이 경우에도 성능이나 관리 편의성을 위해 인덱스 또는 고유한 키를 부여하는 게 일반적입니다.
무조건 PK를 넣자
i. 자동 증가 숫자 ID
id INT AUTO_INCREMENT PRIMARY KEY
ii. UUID 사용
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
iii. 복합 키
PRIMARY KEY (user_id, post_id)
4. 마무리
테이블에는 반드시 PK를 넣어야 합니다. 안 넣어도 동작은 하지만, 어느 순간 큰 장애로 돌아올 수 있습니다.
728x90