스키마 ( Schema )

FeelSoo·2022년 5월 4일
0

CodeStates

목록 보기
29/43

스키마는 뭘까?

쉽게 말하면 테이블 간의 관계도이다.

우리는 SQL에서 테이블 구조를 사용해 데이터를 표현하는 것을 알고 있다.

즉, 스키마는 관계형 DB를 사용할 때 설계하게 된다.

관계형 DB는 서버 사이드 구축시 사용되고.

즉, 서버를 구축할 때 연동할 DB를 설계하기 위한 밑작업이라 볼 수 있다.

그렇다면 스키마를 왜 설계해야 할까?

기존의 테이블 샘플을 가지고 새로운 테이블을 구축할 때 중복되는 요소들을 최대한 줄이고 효율적인 데이터 구성을 진행할 수 있기 때문이다.

아래의 이미지는 스키마의 예시이다.

위의 DB 샘플을 가지고 수강신청을 위한 효율적인 DB를 새로 구축해보자

이미지를 보면 Teachers의 필드로 Classes가 들어가있고 Classes는 Teacher, Students를 필드로 가지고 있다.

그리고 Students 역시 Classes를 필드로 가지고 있다.

여기서 Teachers, Classes, Students 처럼 가장 상단의 목록은 엔티티라고 하며 테이블에 해당하는 요소들이다.

엔티티 안에 담겨있는 각 요소들, 가령 Name, Department 등은 필드라고 하고 테이블의 열에 해당하는 요소들이다.

그리고 필드에 맞춰 들어가는 값들을 레코드라고 한다

또한 id와 같이 해당 테이블의 고유한 필드값을 primary key, 외부 테이블의 값을 참조하는 필드값을 foreign key라고 한다

아래의 이미지는 위의 스키마 중 Teachers 샘플을 테이블로 구성한 것이고 이를 확인하면 엔티티, 필드, 레코드의 개념을 확인할 수 있다.

다시 돌아가서 우선 Teachers와 Classes의 관계를 확인하고 어떻게 하면 두 테이블에서 효율적인 구성을 가진 새로운 테이블을 만들 수 있을지 확인해보자

각각의 교사들은 여러가지 수업을 진행할 수 있고 하나의 강의는 여러 교사들이 가르칠 수 없는 관계다.

즉, Teachers : Classes = 1 : N 의 관계라고 할 수 있다.

그렇다면 테이블로는 어떻게 표현하면 될까?

이렇게 표현하는게 효율적일까? 아니다. ClassID의 공간이 부족할지도 모른다.

그렇다면 이렇게는? 역시나 효율적이지 않다. 새로운 class가 추가될 때마다 class테이블에는 class대로, Teachers 테이블에는 중복된 Name값, classID값이 같이 생성되야 한다. 또한 교사가 개명을 하게 된다면 해당하는 모든 Name값을 업데이트해야 한다.

그렇다면 다음은 어떨까? 새로운 강의가 개설된다면 단지 강좌의 정보들과 교사의 id만 classes 테이블에 표현해주면 된다. 앞선 예시들보다 효율적인 구성으로 보인다.



자 그렇다면 이제 Classes와 Students의 관계를 살펴보자

하나의 Class는 여러 명의 학생들이 수강할 수 있고 한 명의 학생은 여러개의 강의를 수강할 수 있다.

즉, Classes : Students = N : N, 다대다 관계라고 할 수 있다.

그리고 다음과 같은 테이블로 구성할 수 있다.

1 : N 관계에선 N측의 테이블에 필드를 추가했다면, N : N 관계에선 각자의 필드를 추출하여 새로운 테이블을 생성한 것을 확인할 수 있다.

그리고 자세히 살펴보면 Classes/Students 테이블은 Classes, Students와 각각 1 : N의 관계, 즉 2번의 1 : N 으로 생성한 테이블임을 알 수 있다.

이렇듯 N : N 에서 데이터를 추출하여 새롭게 만든 DB를 조인 테이블이라고 하며

결론적으로 수강신청을 위한 스키마 ( 관계도 ) 를 정리하면 다음과 같이 표현된다

스키마를 설계하는 과정을 요약하면 샘플 DB 간의 관계 ( 1 : N인지, N : N 인지 ) 를 확인하고 그에 맞는 효율적인 데이터 테이블을 구성하는 것이다.

profile
세상은 넓고 배울건 많다

0개의 댓글