5P by neo 3달전 | favorite | 댓글 2개
  • 자연(Natural) 키는 데이터베이스에서 고유성을 보장하기 위해 사용되는 키임
  • 자연 키는 이름, 도시, 연도 등과 같은 실제 데이터를 기반으로 함
  • 예를 들어, 세계 최고의 50개 레스토랑 데이터베이스에서 restaurantName, cityName, year를 자연 키로 사용할 수 있음
  • 그러나 자연 키는 고유성을 보장하지 못할 수 있음. 예를 들어, 같은 이름의 레스토랑이 여러 도시에 있을 수 있음

정체성

  • 자연 키는 고유성을 보장하는 것 외에도 정체성을 보장해야 함
  • 예를 들어, 자동차의 차대 번호나 개인 식별 번호(CPR 번호)를 자연 키로 사용할 수 있음
  • 그러나 동일한 사람이 여러 개의 식별 번호를 가질 수 있음. 예를 들어, 덴마크에서는 성전환자가 새로운 CPR 번호를 받을 수 있음

서류 오류

  • 자연 키는 서류 오류에 취약함
  • 데이터 입력 오류, 사용자 오타, 데이터 변환 오류 등이 발생할 수 있음
  • 시스템은 이러한 오류를 수정할 수 있어야 함. 따라서 외부 키를 데이터베이스 키로 사용하는 것은 적절하지 않음

결론

  • 자연 키를 데이터베이스 설계에서 사용하는 것은 좋은 아이디어가 아님
  • 데이터 오류가 발생할 수 있으며, 이러한 오류를 수정할 수 있어야 함
  • 따라서 데이터베이스 테이블에는 항상 인공 키를 사용하는 것이 좋음

GN⁺의 의견

  • 자연 키의 문제점: 자연 키는 고유성과 정체성을 보장하지 못할 수 있으며, 데이터 입력 오류에 취약함.
  • 인공 키의 장점: 인공 키는 고유성과 정체성을 보장하며, 데이터 오류를 쉽게 수정할 수 있음.
  • ORM 사용 시 고려사항: ORM 라이브러리를 사용할 때는 인공 키를 사용하는 것이 더 쉬움. ORM은 데이터베이스 구조를 일정 부분 결정하기 때문에, 인공 키를 사용하는 것이 더 효율적임.
  • 비슷한 기능의 제품: 다른 데이터베이스 설계 도구나 ORM 라이브러리도 인공 키 사용을 권장함. 예를 들어, Hibernate, Entity Framework 등이 있음.
  • 기술 도입 시 고려사항: 새로운 데이터베이스 설계를 도입할 때는 자연 키의 단점을 고려하고, 인공 키를 사용하는 것이 좋음. 인공 키는 데이터 무결성을 보장하고, 오류를 쉽게 수정할 수 있음.
Hacker News 의견
  • 고유하고 짧으며 사람이 읽기 쉬운 ID: Stripe에서 사용하는 cus_MJA953cFzEuO1z 같은 ID를 선호함. JavaScript/TypeScript로 생성하는 방법도 있음.
  • 개인 식별 번호: 덴마크의 CPR 번호와 미국의 SSN을 비교. SSN은 고유하지 않으며, 변경될 수 있고, 미국 시민이 아니어도 발급 가능함. 데이터베이스 키로 사용하지 말 것을 권장.
  • 별칭과 감사 로그: 덴마크 CPR 번호와 같은 자연 키를 사용할 때, 변경 사항을 기록하는 별도의 테이블이 필요함. URL도 자연 키로 사용 가능하지만 변경 시 리디렉션 테이블을 만들어야 함.
  • 자연 키의 한계: 고유 식별자가 변경되면, 모든 관련 정보를 추적해야 함. 인위적인 키를 추가하면 추적해야 할 정보가 더 많아짐. 데이터 모델링은 현실 세계를 반영해야 함.
  • 자연 키와 개인정보 보호: 자연 키에 개인 정보가 포함되면, 외래 키를 통해 다른 테이블에도 전파될 수 있음.
  • 게임 태그 예시: PlayStation Network의 게임 태그를 자연 키로 사용하는 예시. 게임 태그가 변경되지 않으면 고유 식별자로 사용 가능함.
  • 의료 분야 예시: 등록 직원이 잘못된 개인 건강 번호(PHN)를 입력하면 문제가 발생함. 인위적인 키를 사용하면 나중에 정정 가능함.
  • 자연 키의 통제 불가능성: 이름, 주소, 공식 등록 번호 등은 통제할 수 없기 때문에 신뢰할 수 없음. 고유 키 시스템을 사용해야 함.
  • 인위적인 키 사용: 모든 테이블에 고유 ID 필드를 사용하면 문제 해결이 쉬워짐. 데이터와 관계가 자주 변경되기 때문에 자연 키를 믿기 어려움.
  • 변경 가능성과 고유 ID: 변경 가능성은 시간에 걸쳐 공통된 식별자를 필요로 함. 데이터베이스는 명시적인 대리 키를 스키마에 포함해야 함.

인공키도 글로벌 리전 등에 대응하는 분산 환경에 대응 준비가 되어 있는 TSID를 사용하는 것을 추천합니다. 저는 MySQL, DynamoDB에서 PK로 TSID를 사용합니다.

https://jsonobject.hashnode.dev/using-tsid-as-database-pk