[DBMS] MySQL join 및 정규화

개린이·2023년 9월 19일
0

DBMS

목록 보기
4/5
post-thumbnail

join

join이란 두 테이블을 연결하여 원하는 값을 출력하는 키워드이다

기본 문법

select 필드명1, 필드명2... from 테이블명1 [inner, left, right]join 테이블명2
on 테이블1.연결할필드 = 테이블2.연결할필드 [where] 조건문

프로필 테이블

멤버 테이블

inner join

  • 조인하는 테이블의 on 절의 조건이 일치하는 결과만 출력
  • 두 테이블의 교집합
  • join, inner join, cross join 모두 같은 의미로 사용됨

🖥️ 예제

select m.userid, name, gender, mbti from member as m join profile p on m.userid = p.userid;

left/right outer 조인

  • 두 테이블이 조인될 때 왼쪽/오른쪽을 기준으로 기준 테이블의 데이터를 모두 출력한다.
  • outer join은 조인하는 테이블의 on 절의 조건 중 한쪽의 데이터를 모두 가져옴

🖥️ 예제

select m.userid, name, gender, mbti from member as m left join profile p on m.userid = p.userid; -- left join

select m.userid, name, gender, mbti from member as m right join profile p on m.userid = p.userid; -- right join


데이터 정규화

  • 데이터 베이스를 설계할 때 중복을 죄소화하는 것
  • 조직화되어 있지 않은 테이블과 관계들을 조직화된 테이블과 관계들로 나누는 것

데이터 정규화가 필요한 경우

  • 데이터를 갱신, 삽입, 삭제, 테이블을 수정할 때... 원하지 않게 데이터가 삭제되거나 가공되는 일이 발생할 수 있음 -> 이상 현상
  • '이상 현상'이 발생할 가능성이 있다면 정규화가 반드시 필요

정규화의 종류

  1. 1NF(제 1정규화)

    • 테이블 안의 모든 값들은 단일 값이어야 함
    • 더 이상 쪼개질 수 없는 단위로 저장
  2. 2NF(제 2정규화)

    • 1NF를 만족하면서, 완전 함수 종속성을 가진 관계들로만 테이블 생성
    • 종속성들 중 종속 관계에 있는 열들끼리 테이블을 구분해 주는 것
    • 기본키에 속하지 않은 속성 모두가 기본키에 완전 함수 종속인 정규형
    • 함수 종속성: x값에 따라 y값이 결정되는 경우
  3. 3NF(제 3정규화)

    • 2NF를 만족하면서, 기본키에 대해 이행적 함수 종속이 되지 않는 것을 의미
  4. 비정규화

    • 정규형에 일치하게 되어 있는 테이블을 정규형을 지키지 않는 테이블로 변경
    • 테이블을 조회하는 용도로 사용하거나, 너무 데이터가 많이 나뉘어 성능이 저하된다면 비정규화를 하여 테이블을 다루는 것이 더 효율적일 수 있음
    • 어떤 작업을 수행하는지, 어떤 데이터를 사용하는지에 따라 적절한 정규화를 하는 것이 좋음

정규화 예제

완벽한 예제라고 보기는 애매하긴하지만... 이전 JAVA 스프링 프로젝트때 좋아요 기능구현을 해야했는데
처음에는 ERD 중 FEED 게시판 테이블에 like_cnt(좋아요 카운트)를 넣어 좋아요 기능을 구현하려고 하였다.

하지만 생각해보니 이런식으로 하면 누가 좋아요를 눌렀는지 확인을 할 수 없어 기능을 구현하지 못하는 에러가 발생하였고 좋아요 테이블을 하나 추가하는쪽으로 방향을 틀어 개발을 진행하였다.

아래는 해당 기능 작업 시 작성한 erd이다.

기존feed테이블에 like_count가 있는 모습을 확인할 수 있다.
아래 테이블로 수정하였는데 tbl_feed_like 테이블을 추가하여 feed_id, member_id를 각각 fk로 설정해줘 join할 수 있게 작업해주었다.

2개의 댓글

comment-user-thumbnail
2023년 9월 19일

멋지네요 SQLD 공부해보세요

1개의 답글