[DATABASE] 정규화 작업하기

sunaaa·2021년 4월 15일
2

DATABASE

목록 보기
5/5

정규화하기

정규형 종류

  • 아래 목록에서 제3정규형 까지가 산업에서 많이 쓰임.(나머지는 학술적인 용도로 쓰임)
  • 정규형이 한번에 똑 떨어진 것이 아니라, 1970년도부터 천천히 발전해온 것임
  • 정규화를 통해 관계형데이터베이스에 걸맞는 표로 만들어 나가는 것
  • 첫번째 정규형으로 바꾸고, 두번째 정규형으로 바꾸고, 그 다음에 세번째 정규형으로 바꾸어 나가는 것임
  • 즉, 한번에 선택적으로 원하는 것을 하는 게 아니라, 공정처럼 제1정규형 -> 제2정규형 -> 제3정규형 순서로 진행되는 방식임.
  • 행위 자체는 제1정규화를 한다 라고 일컬음
  • 바로 적용해서 사용하기는 어려울 수 있음. 정규화가 무엇인지, 이걸 왜 사용하는 지에 대해 충분히 공감하면 우선 그걸로 충분함. 불필요하게 힘들어하지는 말 것!

정규화 하기 전

제 1 정규화 원칙 : Atomic columns

  • 의미 : 각 행의 의미가 원자적이어야 한다
    : 각 행이 값을 하나만 가져야 한다

  • 예시 : SELECT * FROM topic WHERE tag = 'free'라는 걸 사용하고 - 싶을 때, tag 행에 값이 여러개 들어 있으면 사용할 수 없음.

  • 정규화 이유 : 데이터를 사용하거나 JOIN하는 것이 어렵거나 불가능함

  • 위처럼 짜는 것도 가능함
  • 첫 번째 방법은 중복값이 많이 생김
  • 두 번째 방법은 새로운 태그를 추가할 때마다 컬럼을 추가해줘야 함. NULL값이 많이 생겨서 유연하지 못함.

=> 😎 대안 : 테이블을 쪼개기 !
1. topic테이블과 tag테이블의 Cardinality 관계를 살피기.
: 1:1? 1:N? M:N?
2. M:N이면 테이블 쪼개는 것만으로 안되고 맵핑(연결) 테이블을 만들어 주어야 함.
3. 맵핑 테이블 : 각각의 테이블에서 PK를 가져와서 넣어줌.(ex. topic_title, tag_id) 어떤 테이블에서 가져왔는지 이름에서 명시해주면(title대신 토픽에서 온 타이틀이라는 뜻에서 topic_title) 명료해짐

제 2 정규화 원칙 : No partical dependencies

  • 부분 종속성이 없어야 한다 !
    : 중복키인 것이 없다면 넘어가도 됨. 있다면 부분종속성을 제거할 것.
    아래 표의 빨간색 부분처럼 중복이 발생하면 제 2 정규화가 필요함
  • 위의 경우 MySQL title에만 의존하고 있음.(=부분적으로 종속되고 있음) type이 무엇인지와는 상관없음.
  • topic 테이블의 존재의의는 무엇?
    : price 때문임. 가격은 그 type이 무엇인지에 따라 달라짐
  • title, type, price를 위한 표이지 나머지 컬럼들과는 관련 없음

=> 😎 대안 : 부분적으로 종속되는 컬럼들만 모으고, 전체적으로 종속되고 있는 컬럼들을 쪼개기!

  • topic 테이블 만들기 : 부분적으로 종속되는 정보들만 가져오기
    => 중복되는 행이 존재하지 않는 상태
  • topic_type 테이블 만들기

제 3 정규화 원칙 : No transitive dependencies

  • 의미 : 이행적 종속성. 다른 대상에게 무언가를 이행하라!

  • author_idtitle에 의존하고 있음

  • author_name, author_profileauthor_id값에 의존하고 있음

  • 이러한 것을 이행적 종속성이라고 함

  • 중복을 만들어내는 부분을 따로 author 테이블을 만듦.

    💎 주의 : FK는 중복으로 치지 않음

profile
Be Playful Front-end Developer

0개의 댓글