ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스키마와 쿼리 디자인
    database 2020. 4. 28. 13:08

    개인 프로젝트 DB 스키마 짜기 전에 관련 내용을 정리하려고 한다.

     

    하나의 서비스를 만든다고 가정할 때

    화면의 구성을 상상해보면 👉 어떤 데이터가 필요한지 알 수 있다.

    어떤 데이터가 필요한지 쭉 적어보고, 그 데이터들의 관계를 정하면

    데이터의 구조에 따라 서버를 만들고, 클라이언트를 만든다.

     

    지금까지 진행할 프로젝트는 이런 순서로 진행했다.

    화면의 큰 그림을 생각하고, 스키마를 짜고, API 문서를 작성했다.

     

    데이터 베이스 스키마란?

    데이터 구조를 짜는 것, 그 설계도를 스키마라고 부른다.


    간단한 수강신청 시스템을 예로 들어, 데이터베이스 스키마를 짜는 법에 대해 알아보자.

    수강신청 시스템에서 필요할 것 같은 데이터들을 추려보면

     

     

     

    이렇게 정리해 볼 수 있다.

    교수님, 강의, 학생 각각 하나의 테이블이고,

    어쩌고 저쩌고

     

    관계형 데이터 베이스는 각각의 테이블 사이의 관계를 정의할 수 있다.

    우선 교수님과 강의의 관계를 한 문장으로 표현해 본다면,,

    "교수님이 강의를 한다."

    강의당 교수님은 한 분이지만, 교수님은 강의를 여러 개 맡을 수 있다.

    이런 관계를 1:다 관계라고 한다.

    예시 테이블을 만들어 본다.

     

    <교수님 테이블>

    IDName전공맡고 있는 강의
    1김땡땡수학??
    2이땡땡심리학??
    3오땡땡경제학??

     

    <강의 테이블>

    IDName강의실교수님듣는 학생들
    1강의1101??보류
    2강의2102??보류
    3강의3111??보류
    4강의4101??보류
    5강의5105??보류

    <학생 테이블>

    IDName전공학번듣는 강의들
    1비비비수학141,2
    2지지지수학131,2
    3디디디경제학133,4,5
    4기기기체육학121,2,4
    5시시시공학123

     

    대충 이렇게 있을 때

    물음표로 되어있는 표의 일부분을 어떻게 채울 수 있을까??

     

    김땡땡 교수님이 강의1과 강의2를 맡고 있을 때,

    1김땡땡수학강의1, 강의2

    이런 식으로 써도 괜찮을까??

    다른 테이블의 값을 사용할 때는 테이블의 내용이 바뀔 수 있기 때문에

    고유한 값(대표적으로 ID)를 사용한다.

    1김땡땡수학1, 2

     

    이렇게 쓰게 되면 하나의 필드에 값이 여러 개 들어가게 되는데

    예를 들어 한 교수님이 100개 1000개, 무한개의 강의를 맡게 될 수 있다고 가정해보면,

    "맡고 있는 강의" 필드의 값이 무한히 커지게 될텐데

    데이터의 크기를 정할 수 없는 문제가 생기고,

    추가로 데이터 검색이 어려워진다.

    강의 테이블 ID 5번인 강의의 교수님을 찾기 위해서

    교수님 테이블의 "맡고 있는 강의" 필드를 탐색해야하기 때문이다.

    그럼 이렇게 바꿔서 표현해보면 괜찮을까?

    1김땡땡수학1
    2김땡땡수학2

    이렇게 되면 교수님 테이블의 데이터 중복되는 문제가 발생한다.

    만약에 김땡땡 교수님이 이름을 개명하신다면,, 모든 데이터를 찾아서 바꿔줘야할 텐데

    하나라도 안 바뀌게 되면 데이터의 신뢰성에 문제가 생길 수 있다.

     

    데이터는 항상 중복되지 않도록 스키마를 짜야 한다.

     

    관계를 <교수님 테이블> 쪽에 정의하는 건 여러 문제가 있어 보이니

    <강의 테이블>에 정의하는 방법으로 바꿔 보자.

     

    <교수님 테이블>

    IDName전공
    1김땡땡수학
    2이땡땡심리학
    3오땡땡경제학

    <강의 테이블>

    IDName강의실교수님듣는 학생들
    1강의11011보류
    2강의21021보류
    3강의31112보류
    4강의41013보류
    5강의51052보류

     

    1대 다의 관계일 경우 이런 방식으로 관계를 표현해줄 수 있다.

     

    그럼 강의랑 학생은 어떤 관계가 있을까??

    학생이 강의를 듣는다.

    강의를 듣는 학생은 여러 명일 수 있고, 학생도 강의를 여러 개 들을 수 있다.

    이런 관계를 다:다(다대다) 관계라고 한다.

    어떤 테이블이든 관계를 정의하려고 하면 여러 개의 값이 들어가게 된다.

     

    이런 경우에는 어떻게 할 수 있을까?

    관계를 표현하는 새로운 테이블을 만든다.

     

    <강의&학생 테이블>

    강의ID학생ID
    11
    21
    12
    22
    ......

     

Designed by Tistory.