PK는 int가 좋을까? 아니면 varchar가 좋을까?

최창효·2022년 7월 14일
0
post-thumbnail

결론

  • PrimaryKeyvarchar보다 int로 설정하는 게 좋습니다.

이유

References에 나열한 링크들에서 설명하는 이유들은 다음과 같습니다.

  • 첫째, varcharwhite space를 값으로 가질 수 있기 때문입니다.
    컴퓨터는 AA 를 다르게 구분해 두 값을 모두 PK로 지정할 수 있습니다.
    그 결과 사람의 입장에서는 동일한 A의 PK가 두 개 존재한다고 착각할 수 있습니다.
  • 둘째, PK는 해당 행의 identity를 나타내기 때문에 변하지 않는 게 좋기 때문입니다.
    • 해당 이유는 int보다 varchar가 좋은 이유보다는 varchar를 PK로 사용하지 않는 이유에 가깝습니다. varchar로 선언하는 변수는 대부분 현실 세계에 존재하는 무언가에 대응되는 것들이며, 이들은 언젠가 변하게 될 가능성이 큽니다.
    • email(varchar로 선언하는 값)은 일반적으로 중복이 없는 값이지만 변경요청에 의해 때때로 변하기도 하기 때문에 PK로 선언하는걸 지양해야 합니다.
  • 셋째, intvarchar보다 join시 연산속도가 더 뛰어나기 때문입니다.
    • join연산이 뛰어나다는건 곧 인덱스 성능이 더 좋다는 걸 의미합니다.

기타

natural key & surrogate key

자연키(Natural key)

  • 테이블 column 자체를 PK로 지정한 경우를 말합니다.
  • 비즈니스 모델에서 자연스레 나오는 속성으로 설정한 PK입니다.
  • 당장에는 PK의 조건에 만족하지만 언젠가 값이 변할 가능성이 존재합니다.

대체키(Surrogate Key)

  • 자연키처럼 테이블 column 자체를 PK로 지정하지 않고, 시스템에서 독립적으로 할당한 Key를 의미합니다.
  • DB차원에서 부여하는 고유한 값을 말합니다.
  • 자연키로 설정했을 때 추후에 값이 중복되거나 값이 변경될 가능성이 존재할 것으로 판단되면 대체키를 사용하게 됩니다.

uuid

  • 그럼 uuid도 int가 아니니깐 PK로 적합하지 않은거 아닐까?
    intPK를 설정하는 것에 비해 성능이 떨어지겠지만 uuid는 연속적이지 않아 보안측면에서 우수하며, 중복된 값이 거의 나오지 않는다는 명확한 장점이 존재하기 때문에 PK로 사용하는 경우가 많습니다.
  • 본인 DB의 목적에 맞게 uuid(중복이 절대 발생하면 안되는 경우) 혹은 int값의 PK(성능이 중요한 경우)를 선택해 사용하면 됩니다.
    또는 내부적으로 사용하는 key는 int값의 PK(auto increment)를, 외부에 드러나는 key는 uuid를 사용하는 방법도 좋습니다.

References

profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글