32DAYS) 데이터베이스(2) - 스키마 설계

nacSeo (낙서)·2022년 12월 2일
0

◉ 학습목표

1. 관계형 데이터베이스의 관계를 이해하고 스키마를 설계할 수 있다.
  1. 데이터베이스 설계

⦿ 학습내용

☞ 스키마 (schema)

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

☞ 관계형 데이터베이스 키워드

✔︎ 데이터 (data) : 각 항목이 저장되는 값
✔︎ 테이블 (table 또는 relation) : 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적
✔︎ 컬럼 (column 또는 field) : 테이블의 한 열
✔︎ 레코드 (record 또는 tuple) : 테이블의 한 행에 저장된 데이터
✔︎ 키 (key) : 테이블의 각 레코드를 구분할 수 있는 값, 각 레코드마다 고유한 값을 가짐
✔︎ 키 종류 : 기본키 (primary key), 외래키 (foreign key)

☞ 관계 종류

✔︎ 1:1 관계

  • 하나의 레코드에 다른 테이블의 레코드 한 개와 연결된 경우
  • 자주 사용 ❌ (직접 저장하는 게 나을 수도 있기 때문)

✔︎ 1:N 관계 (일대다)

  • 하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우

✔︎ N:N 관계 (다대다)

  • 여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우
  • JOIN 테이블을 만들어 관리

✔︎ 자기참조 관계 (Self Referencing Relationship)

  • 같은 테이블 안에서의 관계
  1. SQL More

⦿ 학습내용

☞ SQL 내장함수

✔︎ 집합연산 : 레코드를 조회하고 분류한 뒤, 특정 작업을 하는 연산
✔︎ GROUP BY : 데이터를 조회할 때 그룹으로 묶어서 조회

SELECT * FROM 테이블명
GROUP BY 필드명;

✔︎ HAVING : GROUP BY로 조회한 결과 필터링
✔︎ COUNT() : 레코드의 개수를 셀 때 사용

SELECT *, COUNT(*)
FROM 테이블명
GROUP BY 필드명;

✔︎ SUM() : 레코드의 합을 리턴

SELECT *, SUM(필드명)
FROM 테이블명
GROUP BY 필드명;

✔︎ AVG() : 레코드의 평균값을 계산

SELECT *, AVG(필드명)
FROM 테이블명
GROUP BY 필드명;

✔︎ MAX(), MIN() : 각각 레코드의 최대값과 최소값을 리턴

SELECT *, MIN(필드명)
FROM 테이블명
GROUP BY 필드명;

☞ SELECT 실행 순서

✔︎ FROM
✔︎ WHERE
✔︎ GROUP BY
✔︎ HAVING
✔︎ SELECT
✔︎ ORDER BY

◉ 느낀 점

☞ 오늘은 어제 배웠던 SQL문에 몇 가지 명령어를 추가적으로 공부했고, 데이터베이스의 여러 관계들을 학습하며 스키마를 접하여 작성하는 시간을 가졌다. dbdiagram을 통하여 instagram 스키마 디자인을 해봤는데, 처음에는 dbdiagram을 작성할 명령어도 잘 파악하지 못해 머뭇거렸지만, 사용법을 익히며 성공적(?)으로 스키마를 작성했다.
먼저, 빈 노트에 펜으로 틀을 잡고 dbdiagram을 통해 스키마 틀에 적용시켰다. 초반에 배웠던 와이어프레임이 생각나는 시간이었다. dbdiagram에서는 해당 사이트의 명령어들을 이용해 작성할 수도 있지만, mysql을 이용해 작성해도 바로 번역(?)시켜줘서 mysql을 익히는 데도 큰 도움이 될 것 같았다. 여러 가지 방법으로 작성해보며 익혀봐야겠다.
오늘 배운 관계 중 핵심은 1:N(일대다)관계일 때는 N에 1의 id들을 넣어주는 것이고, N:M (다대다) 관계일 때는 따로 JOIN을 사용하여 1:N관계를 두 개로 연결시켜준다는 것이다. 많이 머리 속이 복잡하고 생각을 많이 해야하는 시간이었지만, 그만큼 성장의 밑거름이 됐을 것이라 생각이 든다.
마무리로 내가 작성한 instagram 스키마 디자인을 첨부한다.

// dbdiagram 스키마 디자인 코드
Table users {
  id int [pk, increment]
  name varchar
}

Table following {
  user_id int
  follwer_id int
}

Table followers {
  id int [pk, increment]
  name varchar
}

Table posts {
  id int [pk, increment]
  user_id int
  content varchar
  date int
}

Table pictures {
  id int [pk, increment]
  post_id int
  picture image
}

Table likes {
  id int [pk, increment]
  post_id int
  like int
}

Table comments {
  id int [pk, increment]
  post_id int
  comment varchar
  date int
}

Table hashTags {
  id int [pk, increment]
  hashTag varchar
}

Table post_hasgTag {
  post_id int
  hashTag_id int
}

ref: users.id < following.user_id
ref: followers.id < following.follwer_id
ref: users.id < posts.user_id
ref: posts.id < pictures.post_id
ref: posts.id < likes.post_id
ref: posts.id < comments.post_id
ref: posts.id < post_hasgTag.post_id
ref: hashTags.id < post_hasgTag.hashTag_id

◉ 내일의 키워드

・ 과제 - Learn Schema / SQL (with Pair)
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글