최근에 들었던 질문 중 현실 세계의 식별자를 데이터베이스 기본키로 써도 되냐는 것이 있었다.
이를테면 현실 세계에서 유일함을 보장하는 값들이다.
- 주민 등록 번호
- 전화 번호
- 여권 번호
이들을 데이터베이스의 기본키 (PK) 로 지정해서 쓰는게 어떤가 하는 것이다.
최근의 ORM 예제들을 보면 auto_increment
혹은 uuid
등 개발자가 직접 생성한 기본키을 지정하는데, 왜 그렇게 하는지 모르겠다는 이야기도 들었다.
(나 뿐만 아니라 여러 개발자분들이 같은 생각을 하실것 같은데) 기본키는 절대 바뀌지 않아야 한다.
기본키를 수정하는 것은 항상 많은 문제를 일으킨다.
대부분의 기본키가 여러 테이블의 FK와 인덱스로 지정되어 사용되기 때문이다.
더군다나 위와 같이 현실 세계의 값들은 사용자들이 직접 입력한 값일 경우가 많다.
입력된 값에 오타가 있으면 어떻게 될까?
이미 그 값은 PK와 여러 테이블의 FK로 사용되고 있다면, 그 오타를 수정하기 위해 얼마나 많은 비용이 들까?
기본키를 수정 하기 위해서는 너무나 큰 비용이 든다.
그래서 기본키는 절대 변경되지 않는 속성을 사용해야만 한다.
하지만 현실 세계의 속성은 변경을 내가 제어할 수가 없다.
주민 등록 번호, 전화 번호, 여권 번호 등 현실 세계의 값들은 상황에 따라 언제든 변경 될 수 있다.
실제로 2014년에 주민등록번호 수집이 금지되었다.
그전까지 주민등록번호를 기본키로 갖고 있던 곳들은 호되게 혼났던 것을 듣기도 했다.
흔히 견고한 소프트웨어를 위해서는 코드가 외부에 의존해서는 안된다고 한다.
현실 세계의 값을 기본키로 사용하는 것은 외부에 의존하는 것이다.
현실 세계의 변화와 시스템간의 결합도를 줄여야 한다.
내가 제어할 수 없는 값에 시스템이 의존해서는 안된다.