우리가 살아가는 세상에는 수많은 사람들이 살아간다. 육안으로는 구별하기 힘든 쌍둥이도 존재하고, 이름이 동일한 사람들도 존재한다. 하지만 우리는 사람을 일일이 구별할 수 있어야 한다. 그래서 주민등록번호를 사람마다 부여함으로써 사람을 구별한다.
데이터베이스의 테이블에도 수많은 데이터가 저장되어 있다. 사람들을 구별하기 위해 주민등록번호가 필요하듯이, 수많은 데이터들을 구별하기 위해서 **PK(Primary Key)**라는 걸 사용한다. 즉, **PK(Primary Key, 기본키)**는 특정 데이터를 식별하기 위한 값이다. PK는 중복되어서는 안 되며, 비어있어서도 안 된다.
가끔 주민등록번호
, 이메일
이 특정 데이터를 식별할 수 있는 데이터라고 생각해서 PK로 설정하는 걸 볼 수 있다. 하지만 이는 잘못됐다. 가능성은 적겠지만 주민등록번호
, 이메일
은 바뀔 가능성이 존재한다. PK(Primary Key)가 바뀌게 되면 특정 데이터를 식별하던 값이 바뀌어서 데이터를 관리하거나 사용하는 입장에서 혼란이 올 수 있다. 뿐만 아니라 RDBMS의 성능에도 안 좋은 영향을 미친다.
따라서 현업에서는 PK(Primary Key)를 주로 Auto Increment(숫자가 1씩 증가하는 방식)나 UUID(랜덤값)로 설정을 많이 한다.
사용자와 게시글 데이터를 저장해야 한다고 가정하자. 데이터를 분리해서 저장하기 위해 사용자와 게시글 테이블을 만들어서 아래와 같이 저장했다. 그런데 아래와 같이 게시글 데이터를 저장하면 어떤 사용자가 게시글을 저장했는 지 알 수가 없다. 그래서 게시글 데이터를 저장할 때 사용자 데이터의 PK(기본키)를 같이 저장한다. 게시글 테이블에서 사용자의 PK를 저장하기 위한 값을 보고 **FK(Foreign Key, 외래키)**라고 얘기한다.
<aside>
**FK(Foreign Key, 외래키)**를 한 줄로 요약하자면, 다른 테이블의 데이터와 관계를 연결하기 위한 키이다.
</aside>
[FK 사용 전]
users (사용자)
id | 이름 |
---|---|
1 | 박재성 |
2 | 김유찬 |
posts (게시글)
id | 제목 |
---|---|
1 | 개발자 취업 방법 알려드려요! |
2 | 면접 후기 공유합니다 |
3 | TIL - 객체지향 |