데이터베이스/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