관계형 데이터베이스의 핵심 기본키(Primary Key) 이해하기
테이블 만들기 글에서 TablePlus를 이용해서 users 테이블을 만들었던것을 기억하실겁니다. 이글에서 제가 나중에 설명한다고 했던 부분이 있습니다. 바로, 아래 그림처럼 TablePlus에서 테이블을 만들때 id라고 기본 설정되어있는 Primary 라는 필드입니다. 당시에는 설명을 쉽게하기 위해서 삭제하라고 말씀드렸지만, 이 부분은 데이터베이스를 이해하는데 있어서 매우 중요한 부분입니다. 오늘은 이 Priarmy 혹은 Primary Key라고 부르는 기본키에 대해서 이해해보도록 하겠습니다.
DBMS는 데이터를 일관성있게 관리할 수 있도록 테이블에 다양한 제약 조건들을 설정할 수 있도록 합니다. 기억하시겠지만, 열에 데이터 타입을 설정해서 적절한 데이터 타입이 아닌 데이터가 추가되는 것을 막게하는 것도 일종의 제약 조건입니다. 테이블을 생성할때, 열에 is_nullable 을 설정을 통해 null 값을 허용할지 말지 결정했던 것도 하나의 제약 조건입니다.
기본키 역시 DBMS에서 테이블에 설정하는 하나의 제약 조건 중 하나입니다. 기본키 제약 조건은 테이블 내에서 유일하게 존재하는 값의 조합을 설정해서 중복된 데이터가 테이블에 삽입되는 것을 방지하는 제약 조건입니다. 예시를 통해 알아보도록 합시다.
우리가 만들었던 사용자 정보 테이블 users에서는 하나의 행이 한명의 사용자를 의미합니다. users 테이블에는 사용자가 새로 회원가입을 할때마다 한 행씩 추가될 것입니다. 사용자가 해당 서비스에 가입했던 것을 기억하면 좋겠지만, 잊어버리는 경우가 매우 많습니다. 이때, 중복 삽입을 막는 제약 조건을 설정하지 않았다면 어떤 일이 발생할까요? 동일한 사용자인데, 여러개의 행이 추가 될 수 있을 것입니다. 통계값을 구할때, 몇명의 사용자가 가입했는지 확인하는 과정에서, 이러한 중복 가입 때문에 실제보다 더 많은 사용자가 가입자가 있는 것으로 잘못된 통계값이 구해지게 될 것입니다. users 테이블에 주민등록번호 열을 추가하고 주민등록번호 열을 기본키로 설정해두면 이러한 문제를 방지 할 수 있습니다. 대한민국에 있는 모든 사람은 각자 하나의 주민등록번호를 가지고 있기 때문에, users 테이블에 동일한 주민등록번호가 있다면 이미 가입한 것으로 생각할 수 있기 때문입니다.
기본키는 여러개의 열의 조합으로 설정되기도 합니다. 예를 들어, 날짜별 영업 사원의 판매 실적을 저장하는 sales 테이블이 있다고 합시다. 테이블의 열은 날짜(date), 사원번호(sr), 판매처(customer), 제품명(sku), 수량(qty)로 구성되어있습니다. 6월 1일 날짜 데이터는 여러개 존재할 수 있기에 기본키가 아닙니다. 날짜와 사원번호를 조합 해보아도, 같은 날짜에 동일한 사원이 여러개의 판매처에 제품을 팔 수 있기 때문에 기본 키가 될 수 없습니다. 이 테이블에서 기본 키는 날짜, 사원번호, 판매처, 제품명 이렇게 4개의 조합입니다. 이 4개의 조합을 기본키 제약조건으로 만든다면, sales 테이블은 중복된 데이터가 생기는 것을 방지할 수 있게 되는 것입니다.
이제 우리가 전에 만들었던 users 테이블을 기본 키 제약조건을 추가해서 다시 만들어 보도록 합시다. 이 데이터 에서는 주민번호(rrn)이 기본 키기 때문에 아래와 같이 primary 입력창에 rrn 열을 입력해서 만드시면 됩니다. users 테이블은 이미 만들어져 있기 때문에, users_primary 라는 이름으로 만들도록 하겠습니다.
MySQL은 데이터 타입이 text 인 열은 기본키로 설정할 수 없습니다. text와 동일한 문자형 타입인 varchar(255)를 선택해서 만들어주세요.
TablePlus 에서 테이블을 만들때 기본으로 Primary 정보가 입력되어있는 이유는 그만큼 기본 키가 유용하기 때문입니다. 사실, DBMS 에서 테이블을 만들때 기본 키는 반드시 만드는 것을 추천합니다. 기본 키가 유용한 부분은 크게 2가지입니다.
먼저, 위에서 살펴본것처럼 데이터의 중복을 방지합니다. 데이터가 중복되어 들어가는 것은 일관성 측면에서 큰 문제를 야기합니다. 위 중복 예제에서 김사랑이라는 사람이 3월 1일에 가입했습니다. 5개월이 지나 가입한 사실을 잊어버리고 있다가 8월 2일에 다시 가입을 시도합니다. 그 사이 사랑이라는 이름이 마음에 들지 않아 개명을 했고 키도 조금 컸다고 가정합시다. 기본 키가 설정이 되어있지 않아 가입이 되었습니다. 이렇게 되면, 통계값을 뽑을때 한명의 사람인데 2명이 가입된걸로 잘 못 나올 뿐아니라, 둘중에 어떤게 제대로된 정보인지 판단하기 매우 어렵습니다.
다음으로는 데이터를 매우 빠르게 찾을 수 있게 도와줍니다. 기본 키를 설정하면 DBMS 는 인덱스를 만듭니다. 이 인덱스는 해당 데이터를 빨리 찾을 수 있는 일종의 목차입니다. 사용자 테이블에 10만명의 데이터가 저장된 것으로 가정하고 871203-2347333 주민번호를 가진 사람을 찾는다고 가정합시다. 기본 키가 설정되어있지 않으면, 10만명의 데이터를 모두 조회해야합니다. 왜냐하면, 1개를 찾아도 또 다른 데이터가 존재할 수 있기 때문에 모든 데이터를 살펴봐야합니다. 반면, 기본 키는 전체 데이터에서 유일하게 1개만 존재한다는 것을 의미하기 때문에, 1개만 찾으면 바로 해당 정보를 돌려줄 수 있는 것입니다.
오늘은 기본 키에 대해서 알아보았습니다. 기본 키는 테이블에서 하나의 데이터를 식별할 수 있는 열의 조합입니다. 모든 테이블을 만들때 기본 키를 설정하는 것을 추천하는데, 이는 데이터 중복을 방지해 일관성을 유지할 수 있을뿐 아니라 원하는 데이터를 보다 빠르게 찾을 수 있게 도와주기 때문입니다.
오늘 글 까지해서 데이터베이스에 대한 기본 이해는 끝이 났습니다. 다음 글 부터는 본격적으로 SQL 문법에 대해서 다루겠습니다.