MySQL을 공부하는 과정에서 safe_update_mode에 대해 알게 되었습니다. 이 기능은 기본키(PK)를 통한 update나 delete 작업이 아니면 허용하지 않는다는 점에서 데이터베이스의 안정성을 높이는 역할을 합니다. 그런데 만약 테이블에 기본키가 존재하지 않는다면, 이 기능이 필요 없지 않을까라는 생각이 들었습니다. 여기에서 더 나아가, 테이블에 기본키가 꼭 필요한가에 대한 궁금증이 생겼습니다.
기본키(Primary Key)
기본키(Primary Key, PK)는 여러 후보키 중 하나를 선정해 대표로 삼는 키를 말합니다. 기본키의 제약조건은 아래와 같습니다.
- 테이블 내 튜플을 식별할 수 있는 고유한 값을 가져야 한다.
- NULL 값은 허용하지 않는다.
- 키 값의 변동이 일어나지 않아야 한다.
- 최대한 적은 수의 속성을 가진 것이라야 한다.
- 향후 키를 사용하는 데 있어서 문제 발생 소지가 없어야 한다.
| 고객번호(PK) | 이름 | 주민번호 | 주소 | 핸드폰 |
| 1 | 박지성 | 810101-1111111 | 영국 | 010-1000-0001 |
| 2 | 김연아 | 900101-2222222 | 대한민국 | 010-2000-0002 |
| 3 | 김연경 | 880101-2333333 | 대한민국 | 010-3000-0003 |
| 4 | 추신수 | 820101-1444444 | 미국 | 010-4000-0004 |
위 테이블에서 이름이나 주소는 고유한 값이 아니기 때문에 기본키가 될 수 없습니다. 핸드폰은 사용하지 않는 사람이 있을 수 있어 기본키로 적합하지 않습니다.
주민번호는 고유한 값을 가지며 튜플을 식별할 수 있지만, 개인정보 보호 측면에서 기본키로 사용하지 않는 추세입니다.
따라서 위 테이블에서 기본키는 고객번호가 됩니다.
기본키가 필요한 이유
1. 관계형 데이터베이스에서는 모호함이 있으면 안 된다.
관계형 데이터베이스의 각 테이블은 외래키를 이용해 서로를 참조하고, 이를 통해 관계를 맺습니다.
이때 외래키는 주로 상대 테이블의 기본키를 사용합니다.
만약 기본키가 없다면 컬럼 값들을 고유하게 식별할 수 없으므로 참조 무결성이 깨질 가능성이 있습니다.
고객 테이블
| 이름(PK) | 주민번호 | 주소 | 핸드폰 |
| 박지성 | 810101-1111111 | 영국 | 010-1000-0001 |
| 김연아 | 900101-2222222 | 대한민국 | 010-2000-0002 |
| 김연경 | 880101-2333333 | 대한민국 | 010-3000-0003 |
| 추신수 | 820101-1444444 | 미국 | 010-4000-0004 |
| 추신수 | 991102-5454545 | 대한민국 | 010-5000-0005 |
주문 테이블
| 주문번호 | 상품명 | 가격 | 주문 날짜 | 이름(FK) |
| 1 | 상품1 | 5000 | 2024-07-10 | 추신수 |
| 2 | 상품2 | 6000 | 2024-07-11 | 김연경 |
| 3 | 상품3 | 7000 | 2024-07-12 | 추신수 |
위의 사례처럼 기본키를 이름으로 설정하여 테이블 간의 관계를 맺는다면, 동일한 이름을 가진 여러 사람이 있을 수 있습니다. 즉, 어느 추신수가 상품을 주문했는지 알 수 없습니다. 이는 테이블 간 참조 무결성이 깨지는 상황을 초래합니다.
2. MySQL에서는 기본키가 기본적으로 클러스터 인덱스(Cluster Index)입니다.
MySQL에서는 대량의 데이터에서 검색 속도를 높이기 위해 인덱스를 사용합니다.
대표적으로 클러스터 인덱스와 보조 인덱스(secondary index)가 있습니다.
클러스터 인덱스의 경우, 테이블 생성 시 기본키를 지정하면 기본키에 대해 클러스터 인덱스가 자동으로 생성됩니다.
만약 기본키를 지정하지 않으면, 먼저 나오는 UNIQUE 속성에 대해 클러스터 인덱스가 생성됩니다.
간혹 기본키를 사용하면 성능에 악영향이 있다고 하지만, 실제로 기본키는 매우 작은 비용만을 사용한다고 합니다.
따라서 기본 키를 사용하면 데이터의 무결성을 유지하면서도 효율적인 검색 성능을 제공할 수 있습니다.
'Database' 카테고리의 다른 글
| 클러스터 인덱스와 넌 클러스터 인덱스 알아보기 (4) | 2024.07.17 |
|---|---|
| [MySQL] 외래 키(Foreign Key) 삭제하기 (1) | 2024.02.24 |
느리더라도 단단하게 성장하고자 합니다!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!