If you're seeing this message, it means we're having trouble loading external resources on our website.

웹 필터가 올바르게 작동하지 않으면 도메인 *. kastatic.org*.kasandbox.org이 차단되어 있는지 확인하세요.

주요 내용

관계형 테이블로 데이터 분리하기

지금까지는 한 개의 테이블에서만 작업하고, 그 테이블에서 어떻게 데이터를 뽑을 수 있는지 알아보았습니다. 하지만 대부분의 경우 데이터는 여러 개의 테이블에 걸쳐서 나누어져 있고, 그 테이블들은 서로 어떤 방식으로든 "관계" 되어있습니다.
예를 들어, 학생들이 시험을 얼마나 잘 보았는지 알려주는 테이블이 있고, 성적이 잘 안 나올 경우 부모에게 통보하기 위한 이메일 주소도 포함 되어있습니다.
student_namestudent_emailtestgrade
Peter Rabbitpeter@rabbit.comNutrition95
Alice Wonderlandalice@wonderland.comNutrition92
Peter Rabbitpeter@rabbit.comChemistry85
Alice Wonderlandalice@wonderland.comChemistry95
또한 각 학생이 어떤 책을 읽는지 저장하는 테이블도 있습니다.
student_namebook_titlebook_author
Peter RabbitThe Tale of Mrs. Tiggy-WinkleBeatrix Potter
Peter RabbitJabberwockyLewis Carroll
Alice WonderlandThe Hunting of the SnarkLewis Carroll
Alice WonderlandJabberwockyLewis Carroll
또한 학생들의 자세한 정보를 담고 있는 테이블도 있습니다.
idstudent_firststudent_laststudent_emailphonebirthday
1PeterRabbitpeter@rabbit.com555-66662001-05-10
2AliceWonderlandalice@wonderland.com555-44442001-04-02
이 테이블들에 대해서 어떻게 생각하시나요? 어떻게 바꿀 필요가 있을까요?
이 테이블들은 모두 관계형 데이터를 설명하고 있습니다. 데이터들이 서로 관련되어 있다는 의미입니다. 각 테이블은 특정 학생에 관련된 데이터를 담고 있고, 많은 테이블은 같은 데이터를 포함하고 있습니다. 여러 개의 테이블에 같은 데이터가 복제돼 있을 때, 흥미로운 결과가 있을 수 있습니다.
예를 들어 만약 학생의 이메일 주소가 바뀌었다면 어떨까요? 어떤 테이블을 변경해야 할까요?
학생의 정보를 담고 있는 테이블을 변경해야 하지만, 같은 데이터가 점수 테이블에도 쓰였기 때문에 그 학생에 대한 정보를 담고 있는 모든 행 을 찾아야 하고, 똑같이 이메일을 변경해야 합니다.
특정한 데이터 열은 한 개의 장소 에만 저장하여 업데이트할 부분을 줄이고 데이터의 다른 장소에 저장되는 것을 방지하는 것이 일반적입니다. 이렇게 하려면 테이블 사이에서 데이터를 관계할 수 있는 방법이 필요한데 이부분은 나중에 배워 보겠습니다.
만약 학생 정보 테이블에 있는 이메일이 중복돼서 점수 테이블에서 이메일을 제거하기로 했다고 가정합시다. 그렇다면 다음과 같은 결과가 나옵니다.
student_nametestgrade
Peter RabbitNutrition95
Alice WonderlandNutrition92
Peter RabbitChemistry85
Alice WonderlandChemistry95
각 학생의 이메일 주소를 어떻게 알 수 있을까요? 학생 정보 테이블에서 이름이 일치하는 행을 찾으면 됩니다. 만약 두 학생의 이름이 같다면 어떻게 될까요? (발리에서는 모든 사람의 이름이 4가지 중 1 개인 것을 아시나요?) 학생을 구분하기 위해 이름에만 의존할 수는 없습니다. 사실, 테이블에서 고유한 어떤 것을 구분하기 위해서 절대로 이름 같은 것을 사용해서는 안 됩니다.
따라서 가장 좋은 방법은 student_name을 제거하고 학생 고유의 번호를 부여해주는 student_id으로 교체하는 것입니다.
student_idtestgrade
1Nutrition95
2Nutrition92
1Chemistry85
2Chemistry95
책 테이블에도 student_name 대신 student_id를 사용하여 다음과 같이 바꿀 수 있습니다.
student_idbook_titlebook_author
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
1JabberwockyLewis Carroll
2The Hunting of the SnarkLewis Carroll
2JabberwockyLewis Carroll
Jabberwocky 이란 제목과 그 저자가 어떻게 두 번 반복되는지 보이시나요? 이것은 테이블을 여러 개의 관계되는 테이블로 나누어야 하는 또 다른 이유입니다. 그렇게 하면 책에 대한 내용이 바뀔 때 여러 곳을 변경할 필요가 없습니다.
책에 관한 내용만 담고 있는 다음과 같은 테이블을 가질 수 있습니다.
idbook_titlebook_author
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
2JabberwockyLewis Carroll
3The Hunting of the SnarkLewis Carroll
이제 student_books 테이블은 다음과 같이 변합니다.
student_idbook_id
11
12
23
22
이 테이블은 모든 행에 정보가 다 들어 있던 이전의 테이블처럼 읽기 편하지 않습니다. 하지만 테이블은 보통 사람이 읽기 편하도록 디자인하지 않습니다. 테이블은 데이터를 가장 유지하기 쉽고 버그가 적은 방법으로 디자인합니다. 많은 경우 정보를 여러 개의 관계형 테이블로 나누면, 불필요한 데이터를 최소화하고 업데이트할 부분을 최소화할 수 있습니다.
SQL을 사용하여 여러 개의 관계형 테이블로 쪼개진 데이터를 어떻게 다루고 필요할 때 데이터를 한 곳으로 가져오는지 이해하는 것이 중요합니다. 이는 다음에 배울 "join"이라는 개념을 사용합니다.