2 분 소요

정규화!

식별관계와 비식별관계를 정리하면서 데이터 정규화에 대해 다시 정리를 했다.
해당 부분도 정확하게 아는 것 같지가 않아서 다시 찾아보고 정리를 했다.

우선 식별관계와 비식별관계를 오류없이 하기 위해서는 데이터를 정규화해야 한다. 이런 정규화 개념이 없다면 나중에 여러가지로 문제가 생길 수 있다.

무엇보다 데이터 정규화를 왜 하는 걸까? -> 데이터를 효율적으로 사용하기 위해 데이터에 대한 평탄화 작업이 필요하며 이것이 정규화다.

이상현상 (anormaly)

  • 정규화를 거치지 않은 데이터베이스에서 발생할 수 있는 현상
  • 갱신,삽입,삭제 이상이 있다.

정규화 목적

  • 이상 발생 방지
  • 무결성 유지
  • 효율적인 검색
  • 결론은 휴먼에로 최소화

첫 번째 평탄화

  • 1NF : 도메인이 원자 값이어야 한다. (list 이런거 쓰지 말란 얘기)
  • 데이터베이스에서 도메인은 문자, 숫자 등의 자료형을 말한다, 도메인 주도설계에서 말하는 도메인은 데이터베이스의 스키마급 개념이다.

| 데이터베이스 | 객체지향프로그래밍 | 비고 | | ——– | :——– | ——————————— | | 스키마 | 도메인 | 스키마는 데이터를 위한 데이터. 메타데이터로 표현 | | 속성(컬럼) | 필드 | 데이터베이스에는 ‘행위’ 메서드라는 개념이 없다. | | 도메인 | (원시) 자료형 | 문자, 숫자, 불린등 | | 엔티티(테이블) | 데이터객체 | 필드로 구성된 클래스를 말한다
(JPA의 entity) |

정규화 전

정규화 후

두 번째 평탄화

  • 2NF : 부분적 함수 종속성 제거
  • 복함키에서 후보키에 종속되어있는 경우 별도 테이블로 분리해준다.
  • 정규화 후 두 테이블은 자연스럽게 식별 관계가 된다.

정규화 전

1차 정규화

  • 담당교수는 수강과목에 종속적이고 수강과목은 후보키다

2차 정규화

자연스럽게 식별관계로 연결되었고, 수강과목과 학생과의 다대다 관계가 해소되었다.

  • M : M -> 1:M , M:1

세 번쨰 평탄화

  • 3NF : 종속적 (이행적) 함수 종속성 제거
  • a -> b , b -> c 인경우 a -> c가 성립하는 경우
  • 정규화 후 두 테이블은 비식별 관계가 된다.

정규화 전

학생은 학과에 종속되고 학과는 단과대에 종속됨

분리

  • 학과를 기준으로 단과대를 넣을 수 있지만 단과대를 기준으로 넣어야한다면?
  • 공과대는 검색 결과가 2개임 그래서 단과대 컬럼과 학과 두개 컬럼이 다 필요함 이런 복합키는 조인할 때 귀찮다고 함 그래서 학과 코드라는 대체키 하나로 관리

  • 2차 정규화는 식별 관계
  • 3차 정규화는 비식별관계
  • 학과코드는 학생현황에 키로 참여하고 있지 않음 -> 비식별 관계

    조금 힘든 평탄화

  • BC(Boyce-Codd)NF : 결정자이면서 후보키가 아닌 것 제거
  • 마스터 코드 관리 테이블 정도로 표현하게 된다.
  • ERD를 그릴 때 마스터 코드는 릴레이션을 굳이 표시하지 않는다.

정규화 전

정규화 후

  • 등급 기준에 따라 값이 정해진다.
  • 하짐나 성적은 후보키가 아니므로 테이블을 분리하면 기준 데이터를 찾을 수 없게 된다.
  • 기준 테이블을 별도로 만들고 DDL 작성시 코멘트에 적어두어야 한다.

  • 밑에 분리된 등급 기준표는 왜래키도 아니고 후보키도 아닌 것에서 분리되었으므로 관계를 가지지 않는다.
  • 여러기준을 만족하는 마스터 테이블을 구성하는 것은 설계자의 노하우다.

위와 같이 마스터 테이블은 ERD 관계도에 표시되지는 않지만 매우 중요한 테이블이다.

평탄화를 하지 말아야 할 때 (역정규화)

  • 테이블이 너무 쪼개져서 조인하기 힘들 때
  • 보통 개발 편의를 위해 하는데 위와 같이 중간고사 테이블에 이름이 꼭 들어가야할 경우 이름을 수정하게 되면 무결성의 원칙이 깨지기 때문에 해당 컬럼은 수정을 하지 못 하게 막아둠

댓글남기기