ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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연산은 비싸기 때문이다. 그렇다고 정규화가 성능을 떨어뜨린다는 것은 아니다.
    • 따라서, 인덱싱이나 캐시 기법을 쓰고도 데이터베이스의 느림이 인지된다면, 역정규화(테이블 수정)을 거친다.
Designed by Tistory.