-
Modeling(데이터베이스 모델링)백엔드 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연산은 비싸기 때문이다. 그렇다고 정규화가 성능을 떨어뜨린다는 것은 아니다.
- 따라서, 인덱싱이나 캐시 기법을 쓰고도 데이터베이스의 느림이 인지된다면, 역정규화(테이블 수정)을 거친다.
'백엔드' 카테고리의 다른 글
php와 mariaDB(xampp, mysql) (2) 2023.05.27 [Django] JWT TOKEN(access token, refresh token, crfs, cors error) (0) 2023.05.04 [Git] 커밋 기록 삭제 및 복구 (0) 2023.03.26 django ch1 - ch4 (0) 2023.03.22 스프링 부트와 AWS로 혼자 구현하는 웹 서비스(-78p) (1) 2023.01.06