-
스키마와 쿼리 디자인database 2020. 4. 28. 13:08
개인 프로젝트 DB 스키마 짜기 전에 관련 내용을 정리하려고 한다.
하나의 서비스를 만든다고 가정할 때
화면의 구성을 상상해보면 👉 어떤 데이터가 필요한지 알 수 있다.
어떤 데이터가 필요한지 쭉 적어보고, 그 데이터들의 관계를 정하면
데이터의 구조에 따라 서버를 만들고, 클라이언트를 만든다.
지금까지 진행할 프로젝트는 이런 순서로 진행했다.
화면의 큰 그림을 생각하고, 스키마를 짜고, API 문서를 작성했다.
데이터 베이스 스키마란?
데이터 구조를 짜는 것, 그 설계도를 스키마라고 부른다.
간단한 수강신청 시스템을 예로 들어, 데이터베이스 스키마를 짜는 법에 대해 알아보자.
수강신청 시스템에서 필요할 것 같은 데이터들을 추려보면
이렇게 정리해 볼 수 있다.
교수님, 강의, 학생 각각 하나의 테이블이고,
어쩌고 저쩌고
관계형 데이터 베이스는 각각의 테이블 사이의 관계를 정의할 수 있다.
우선 교수님과 강의의 관계를 한 문장으로 표현해 본다면,,
"교수님이 강의를 한다."
강의당 교수님은 한 분이지만, 교수님은 강의를 여러 개 맡을 수 있다.
이런 관계를 1:다 관계라고 한다.
예시 테이블을 만들어 본다.
<교수님 테이블>
ID Name 전공 맡고 있는 강의 1 김땡땡 수학 ?? 2 이땡땡 심리학 ?? 3 오땡땡 경제학 ?? <강의 테이블>
ID Name 강의실 교수님 듣는 학생들1 강의1 101 ?? 보류2 강의2 102 ?? 보류3 강의3 111 ?? 보류4 강의4 101 ?? 보류5 강의5 105 ?? 보류<학생 테이블>
ID Name 전공 학번 듣는 강의들1 비비비 수학 14 1,22 지지지 수학 13 1,23 디디디 경제학 13 3,4,54 기기기 체육학 12 1,2,45 시시시 공학 12 3대충 이렇게 있을 때
물음표로 되어있는 표의 일부분을 어떻게 채울 수 있을까??
김땡땡 교수님이 강의1과 강의2를 맡고 있을 때,
1 김땡땡 수학 강의1, 강의2 이런 식으로 써도 괜찮을까??
다른 테이블의 값을 사용할 때는 테이블의 내용이 바뀔 수 있기 때문에
고유한 값(대표적으로 ID)를 사용한다.
1 김땡땡 수학 1, 2 이렇게 쓰게 되면 하나의 필드에 값이 여러 개 들어가게 되는데
예를 들어 한 교수님이 100개 1000개, 무한개의 강의를 맡게 될 수 있다고 가정해보면,
"맡고 있는 강의" 필드의 값이 무한히 커지게 될텐데
데이터의 크기를 정할 수 없는 문제가 생기고,
추가로 데이터 검색이 어려워진다.
강의 테이블 ID 5번인 강의의 교수님을 찾기 위해서
교수님 테이블의 "맡고 있는 강의" 필드를 탐색해야하기 때문이다.
그럼 이렇게 바꿔서 표현해보면 괜찮을까?
1 김땡땡 수학 1 2 김땡땡 수학 2 이렇게 되면 교수님 테이블의 데이터 중복되는 문제가 발생한다.
만약에 김땡땡 교수님이 이름을 개명하신다면,, 모든 데이터를 찾아서 바꿔줘야할 텐데
하나라도 안 바뀌게 되면 데이터의 신뢰성에 문제가 생길 수 있다.
데이터는 항상 중복되지 않도록 스키마를 짜야 한다.
관계를 <교수님 테이블> 쪽에 정의하는 건 여러 문제가 있어 보이니
<강의 테이블>에 정의하는 방법으로 바꿔 보자.
<교수님 테이블>
ID Name 전공 1 김땡땡 수학 2 이땡땡 심리학 3 오땡땡 경제학 <강의 테이블>
ID Name 강의실 교수님 듣는 학생들1 강의1 101 1 보류2 강의2 102 1 보류3 강의3 111 2 보류4 강의4 101 3 보류5 강의5 105 2 보류1대 다의 관계일 경우 이런 방식으로 관계를 표현해줄 수 있다.
그럼 강의랑 학생은 어떤 관계가 있을까??
학생이 강의를 듣는다.
강의를 듣는 학생은 여러 명일 수 있고, 학생도 강의를 여러 개 들을 수 있다.
이런 관계를 다:다(다대다) 관계라고 한다.
어떤 테이블이든 관계를 정의하려고 하면 여러 개의 값이 들어가게 된다.
이런 경우에는 어떻게 할 수 있을까?
관계를 표현하는 새로운 테이블을 만든다.
<강의&학생 테이블>
강의ID 학생ID 1 1 2 1 1 2 2 2 ... ... 'database' 카테고리의 다른 글
관계형 VS 비관계형 (NoSQL) 데이터베이스 (0) 2020.04.15 레디스(Redis)란 무엇인가? (0) 2020.04.15 [AWS] 클라우드 데이터베이스 서비스 RDS 사용하기 (0) 2020.04.14