백엔드

Modeling(데이터베이스 모델링)

_JIONE_ 2023. 4. 2. 21:44

 

1장

업무 파악 > 개념적 데이터 모델링(erd diagram) > 논리적 데이터 모델링(표) > 물리적 데이터 모델링(sql 코드)

 


 

2장

업무파악 - 의뢰한 사람과 ui 그려보기(기획서 제작)

 

3장

글 읽기
글 작성과 저자 참여


 

4장

개념적 데이터 모델링: 연관된 정보를 그룹화하여 그룹끼리의 관계를 표현한다.

ERD

 

5장

관계형 데이터 모델링을 위해 두 번째를 선택

원하는 데이터만을 join하기에 쉽다.

 


 

6장

'글'에 '저자'를 속성으로 넣지 않는 이유는, '저자'만의 '저자 소개','저자 가입일' 등의 속성을 가지기 때문이다.

PK, FK로 관계를 가지게된 테이블들은 JOIN을 통해 연결할 수 있게 된다.

 

7장, 8장

식별자 선택: PK 선택

식별자 선택(글아이디, 댓글아이디, 저자아이디)

9장

세모가 관계


 

10장

 

cardinality: 1:1, N:1, N:M

 

 

 

1:1
1:N
여기는 다대다 관계로 설정, 노션같은 앱이기때문.

하지만, 에브리 타임 앱에서, '작성'이라는 관계로 묶여있는 저자와 글은 1:N으로 설정해야 한다.

 

11장

optionality: 필수와 선택

저자에게 댓글은 선택적으로 작성할 수 있지만, 댓글은 반드시 저자가 필요

 

cardinality와 optionality를 모두 고려


12장

댓글은 글이 필수이며 하나, 댓글은 저자가 필수이며 하나


13장

논리적 데이터 모델링: mapping rule

개념 -> 논리

14장

1:1

기본키와 연결된 외래키는 타입이 같아야 한다.

휴면저자(부모테이블)는 저자(자식테이블)를 알아야 값을 넣을 수 있다.(의존 관계) + 1:1 관계
휴면저자 테이블에서 author_id를 기본키이자 외래키로 설정

 

15장

1:N

댓글은 선택, 댓글에게 저자나 게시글은 필수 + 1:N 관계

 

 


 

16장

N:M - 어느 테이블에 JOIN을 해야하는지 애매해서 문제 -> 연결 테이블이 필요

 

 

노란색부분을 보면 속성값이 겹치는 걸 볼 수 있음 => n:n => 문제
연결 테이블 생성해서 해결

 


17장: 정규화

정규화되지 않은 표 => 중복되는 값들(핑크, 빨강, 하늘)

 


 

18장: 제1 정규화(각 칼럼의 값들이 atomic 해야한다)

  •  하늘색 부분에 대한 문제와 해결

SELECT * FROM topic WHERE tag='free', 

SELECT * FROM topic ORDER BY tag

같은 명령어를 쓸 수 없다.

tag table을 따로 빼고, 연결테이블을 만들어 해결


19장: 제2 정규화(부분 종속성을 없애야 한다 if 중복키가 있다면)

  • 핑크색 부분에 대한 문제와 해결(중복되는 값)

문제
세부 테이블을 만들어 해결


20장: 제3 정규화(이행적 종속성을 만족시켜야 한다)

 

해당 테이블에서 하나의 행은 title(기본키)에 의존하나, author_name과 author_profile은 author_id에 의존하는게 문제

중복되는게 문제다. 테이블을 따로 빼보자.

해결

 

 

 


회고

  • 에브리타임은 user와 post관계가 1:n이다. '작성'이라는 관계로 묶여있기 때문이다.
  • 속성으로 배열을 넣으면 안된다. 정렬에 문제가 생겨 정보가 누락되기 때문이다. ex. where문, order by문, join문 => 테이블 분리 by 제1 정규화 법칙
  • n:m 관계는 연결 테이블을 만들어 1:n, 1:n으로 이어 해결한다. (단, 연결테이블을 만들 때는 중복될 수 있는 값을 고려해 기본키를 잘 설정해야한다.) ex. user table - write table - post table
  • 정규화를 통해 잘 쪼개진 테이블은 읽기 기능을 희생시켜 쓰기 기능을 올린 것이다. join연산은 비싸기 때문이다. 그렇다고 정규화가 성능을 떨어뜨린다는 것은 아니다.
  • 따라서, 인덱싱이나 캐시 기법을 쓰고도 데이터베이스의 느림이 인지된다면, 역정규화(테이블 수정)을 거친다.