[TIL]schema & sql 정리

Violet Lee·2021년 1월 13일
0

DB

목록 보기
1/1

Before you learn ...

  • sql이 어떻게 이루어져 있는지 이해한다.
  • 기본 쿼리문을 사용할줄 안다.
  • 스키마의 기본 설계방법과 나은 방향성을 고안한다.
  • 서버와 클라이언트 사이에서 주고받는 데이터를 db에 저장해서, 영속성있게 저장할수있다.

sql(structured query language) = 구조화된 쿼리언어.

  • 데이터베이스 용 프로그래밍 언어
  • db에 쿼리를 보내, 원하는 데이터만을 뽑아올수있다.

~ 효율적인 데이터 저장방식의 순서 ~

  1. In-memory : 서버든 클라이언트든 끄면 데이터가 없어진다는 단점이 있다.

  2. File I/O : 서버에 데이터 저장.
    그러나 원하는 데이터만 가져올수없고, 항상 모든 데이터를 가져온뒤 서버에서 필터링 필요.

  3. DB: 필터링 외에도 File I/O로 구현이 힘든 관리를 위한, 여러기능들을 가지고있는 데이터에 특화된서버


schema & query design

스키마 ( = 데이터베이스의 청사진 )

: 데이터베이스에서 데이터가 구성되는 방식과 서로다른 엔티티간의 관계에 대한 설명

엔티티(= 테이블)

: 고유한 정보의 단위. 아래의 예제에서는 티쳐스,클래스들,스튜던츠 이다.

레코드

: 테이블에 저장된 항목. 즉, 행.

ex) 아래의 예제에서는 music theory,brass methods 수업을 가르치는 
     음대의 Cynthia선생님을 말한다.
      

EX) 학교 데이터베이스

🤔Teachers 와 Classes 사이의 관계를 담기위해, 어떤 형태로 정보가 저장되어야 할까?🤔

S (1). Teachers 테이블의 Classes 컬럼에 내용을 채우기

A. 교사가 담당하는 수업목록에 대해, 수업이름을 나열하여 저장하기

Problem
ex) 어느날 갑자기 'PSY 101'의 수업이름이 변경되어버리면,
티쳐 테이블의 해당수업명을 모조리 찾아내서 변경해야됨.

A. 수업이름 대신 그러면 해당 ID를 저장하는걸로 대체.

Problem
ex)

  • 고유한 ID라는 기본키를 이용해 외래키로 사용하여 레코드를 연결하는
    문제는 해결됐는데, 만약 학교가, 교사가 맡아야되는 수업 수를
    늘려버리면 수업 ID를 담을 공간이 부족해져서 안됨(열의크기는 무조건 고정이니까)
  • 그리고 한 열에 여러값 넣어버리면 상수시간에 대한 검색손실 발생.
    굳이 한명의 교사의 학생을 검색하기위해
    해당교사의 classID열의 값을 반복(?)해야함.

A. 하나의 열에 여러값 저장못하니까 각 교사에 대해 그러면 여러개의 레코드를 만들어버리기.

Problem
ex) kelly가 개명을 해서 celly로 변경했고, 그래서 그녀의 모든 classID를 알아서 이름변경을 해야하는데, 클래스아이디 하나라도 잘못 알았다간 모든 컬럼의 값 변경을 못하게된다. => '정합성이 깨진다'

S (2). Teachers 테이블을 Classes 테이블에 저장하기.

👌 correct 👌
=> 교사가 가르치는 모든 수업 검색 가능하고, 앞의 모든문제 해결가능.


🤔classes 랑 students 사이의 관계를 담기위해, 어떤 형태로 정보가 저장되어야 할까?🤔

일단, 얘네는 각 수업은 여러명의 학생들로 구성되있고,
각 학생또한 여러개의 수업을 듣기때문에 N:N 관계이다.

A. 클래스 테이블에 여러개의 student ID들 저장 못함.

Problem
=> 하나의 열에 여러값 저장못함

A. 반대로 여러개의 class ID들을 학생 테이블에 저장도 안됨.

Problem
=> 위와 같은 문제 ㅇㅇ

A. 글자로 표시했던 학생이름들, 수업이름들을 번호로 할당된 ID로 교체해보자. 즉, classID랑 studentID들이 교차하는 좌표들을 하나의 테이블로 시각화하는 것이다.

👌 correct 👌
=> 얘를 join테이블이라 함. 스키마에서 수업 대 학생, 학생 대 수업?
관계를 보여줌.

     
             1    ∞ 		       ∞    1
==> CLasses  <-----> Classes/Students <-----> Students
								
                           [join]

*auto increments : value 자동 증가
: 테이블 필드를 생성할시에, 각 테이블은 기본적으로 id라는 필드가 존재한다.
이는 각 테이블의 레코드 하나를 가리키는 숫자로, 자동적으로 그 값이 증가한다
이 id필드는 해당 테이블의, 기본키(primary key)역할을 한다.

*query: 질의문.

  • 검색창에 적는 검색어도 쿼리의 일종이 될수있다.
  • 저장되어있는 정보를 필터하기위한 질문

ㅠㅠ 힘들다... 파이..팅...... ㅜ

profile
예비개발자

0개의 댓글