관계형 데이터 베이스 모델링의 기초에 대해서 공부했다. 생활 코딩 수업의 내용을 간략하게 정리한 것임으로 생활 코딩을 보는 것을 추천한다.

생활코딩 - 관계형 데이터 모델링

Model이란?

데이터 모델이 되는 순서

  1. 업무파악
  2. 개념적 데이터 모델링 ER
  3. 논리적 데이터 모델링
    • 표로 그리는 것
  4. 물리적 데이터 모델링
    • 실재로 표를 코드로 작성하는 것

업무 파악

업무 파악 단계는 기획서와 연관되어있다.(혹은 기획을 하는 것과)

개념적 데이터 모델링

모델링이 필요한 이유

주제별로 쪼개기

ERD를 구성하는 것들

Entity

Attribute

Relation

Tuple

entity 코드로 옮겨보기

typeorm을 사용하는 환경에서 user entity를 만든다고 했을 때 코드로 옮겨보자.

user.entity.ts
1@Entitiy()
2class User extends BaseEntity { // User는 entitiy이므로 User Table로 치환할 수 있다.
3 @IsNotNull()
4 id:string; // attribute는 column으로 치환된다.
5
6 @Column()
7 username : string;
8
9 @OneToMany(type => BeforeUnloadEvent, (board)=>board.user, {eager:true}) // relation
10 board:Board[]
11}

엔티티 정의

ERD 실습

식별자 정의

후보키 - Candidate key

기본키 - Primary key

대체키 - Alternate key

중복키 - composit key

관계 정의(Relation ship)

외래 키 Foreign key

Cardinality, Optionality

Cardinality

Optionality

논리적 데이터 모델링

Mapping Rule

Table, Column, PK, FK

구름 ERD를 사용했다.

실습

정규화(Normalization)

정규화

Unnormalized form

First Normal Form

Second Normal Form

Third Normal Form

물리적 데이터 모델링

성능을 개선시킬 수 있는 방법들

index

cache

역정규화 denormalization

데이터 모델링 기초 수업을 마치면서

Prisma를 가지고 DB를 만들고 있는데 점점 관계가 복잡해지면서 어떻게 DB를 설계해야할까 하는 질문에서 검색을 시작했다. 도착지는 생활 코딩 RDB 모델링 수업이었다. 하루만에 다 들을 수 있고 또 복습도 하루만에 다시 해볼 수 있는 장점이 있다.

사이드 프로젝트를 하면서 구름 ERD를 가지고 모델링을 하는데 '논리형과 물리형이 뭐지?'라는 질문이 있었다. 그 질문을 이 수업을 통해서 해소할 수 있었다. 간단하게 논리형은 논리적으로 DB가 이렇게 구성된다는 것이고 물리형은 실재 코드로 작성된 DB를 말한다. ERD를 구성할 때 많은 도움이 되었다. NestJS로 API를 만들면서 entity를 왜 만들까 하는 질문이 있었는데 코드로 ERD를 작성하고 그 ERD로 DB를 제어하기 위한 목적이라고 정리했다.

맵핑 테이블이 필요한 이유를 잘 몰랐다. ORM에서는 맵핑 테이블 없이 관계를 만들어주니까 그냥 그런가보다 했다. 하지만 동료 백엔드 개발자가 맵핑 테이블은 꼭 만들어서 쓰라고 조언을 해주었다. 아마 그때 설명은 역정규화 관점에서 맵핑 테이블의 필요성을 이야기 한 듯 하다. 이 수업에서는 Many To Many 관계에서는 맵핑 테이블의 필요성을 배웠다. 만약 맵핑 테이블이 없으면 데이터 중복이 많이 일어날 것 같다.

DB를 조회하는 것은 업무를 보는데 도움이 많이 되는 것 같다. 데이터를 보냈을 때, 혹은 데이터가 실제로 쓰였는지 등을 조회할 때 Select를 사용해서 DB를 조회하고 있다. 생각보다 유용하다. SQL Teaching이라는 온라인 사이트가 있는데 SQL을 처음 접한다면 이곳에서 연습해볼 것을 추천한다.