2020/01/16

Foreign Key 가 뭔가요?

Foreign Key 가 뭔가요?

데이터 저장

여럿이서 운영하는 블로그의 글을 스프레드 시트에 저장 해본다고 합시다. 데이터는 다음과 같이 저장할 수 있을겁니다.

제목 내용 글쓴이 글쓴이 직업
데이터는 어디에 저장되나요? 마음속에 김슬 개발자
포린키는 뭔가요? 그러게요 김슬 개발자
장고를 쓰는 이유 이정도면 좋아서요 김슬 개발자
글제목 짓기 힘들다 내용도 힘들다 김작가 작가

중복 데이터의 문제

그러다가 한 글쓴이의 직업이 바뀌었습니다. 그럼 변경된 직업을 데이터에 반영 해보겠습니다.

제목 내용 글쓴이 글쓴이 직업
데이터는 어디에 저장되나요? 마음속에 김슬 백수
포린키는 뭔가요? 그러게요 김슬 백수
장고를 쓰는 이유 이정도면 좋아서요 김슬 개발자
글제목 짓기 힘들다 내용도 힘들다 김작가 작가

반영을 하다가 중간에 깜빡하고 글 하나에서 글쓴이 직업을 수정하는걸 깜박했습니다.

어디에서는 직업을 개발자라고 하고 어디서는 직업이 백수라고 하는데 어느게 맞는걸까요?

중복 데이터를 만들지 않는 방법

이런 중복 데이터로 인한 혼란을 막기 위해 사람들은 '하나의 데이터는 한번만 저장'하는 방법을 생각해 냅니다.

예를 들면 이렇게 데이터를 저장하는 겁니다.

제목 내용
데이터는 어디에 저장되나요? 마음속에
포린키는 뭔가요? 그러게요
장고를 쓰는 이유 이정도면 좋아서요
글제목 짓기 힘들다 내용도 힘들다

쓴 사람

글쓴이 글쓴이 직업
김슬 백수
김작가 작가

데이터 간의 연결

그러면 이제 어느 글을 누가 썼는지 연결할 방법이 필요합니다. 연결을 하려면 각 항목은 각 항목을 알아볼 수 있는 겹치지 않고 유일하며 변하지 않는 대표 값을 지녀야 합니다. 하나씩 숫자를 늘려가며 붙여주면 손쉽게 이런 대표값을 지정할 수 있을 것 같습니다.

ID 제목 내용
1 데이터는 어디에 저장되나요? 마음속에
2 포린키는 뭔가요? 그러게요
3 장고를 쓰는 이유 이정도면 좋아서요
4 글제목 짓기 힘들다 내용도 힘들다

쓴 사람

ID 글쓴이 글쓴이 직업
1 김슬 백수
2 김작가 작가

이렇게 방금 추가한 ID를 고유 키(Primary Key)라고 합니다.

그리고 이제 어떤 글을 누가 썼는지 표시를 해보겠습니다.

ID 제목 내용 쓴 사람 ID
1 데이터는 어디에 저장되나요? 마음속에 1
2 포린키는 뭔가요? 그러게요 1
3 장고를 쓰는 이유 이정도면 좋아서요 1
4 글제목 짓기 힘들다 내용도 힘들다 2

쓴 사람

ID 글쓴이 글쓴이 직업
1 김슬 백수
2 김작가 작가

이렇게 추가된 '쓴 사람 ID'가 바로 외래 키(Foreign Key) 입니다.

그리고 이제는 직업이 바뀌어도 한 곳만 수정하면 되고 다르게 저장된 데이터 때문에 헷갈릴 일이 없습니다.
방금 진행한 이런 중복을 제거하는 작업을 정규화 라고 부릅니다.