정규화

Park sang woo·2024년 3월 17일

12주차 DataBase

목록 보기
4/5

📓 함수 종속성

어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 관계를 종속성이라 한다.

“종속성 = 화살표” + “결정자 = 유일키”
A -> B 같이 화살표로 표기하고 A를 B의 결정자라고 한다.


학생과 수강 그리고 성적의 속성에는 의존성이 존재한다고 표현할 수 있다. 의존성은 501이라는 학생 번호를 보면 학생 이름이 박지성으로 정해지는 관계를 의미한다.

속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 의존관계.
속성 B는 속성 A에 종속한다. OR A는 속성 B를 결정한다.

그 외에도 아래의 그림에는 학과 -> 학과사무실, 강좌이름 -> 강의실과 같은 종속관계가 있다.
단 동명이인이 있는 것처럼 학생의 이름으로 학과를 결정하지 못하면 종속 관계가 아니다.



🏷️ 이상현상과 결정자

이상현상은 한 개의 릴레이션에 2개 이상의 속성이 포함되어도 되고 기본키가 아닌 속성이 결정자일 때 발생한다.
이상현상 해결을 위해 “하나의 테이블 내 여러 결정자를 허용할 수 없다.” 는 원칙.

이상현상을 해결하기 위해 우리는 총 4개의 릴레이션으로 학생 수강 성적 릴레이션을 분해.






📓 정규화

정규화는 함수 종속성을 이용해서 릴레이션 연관성이 있는 속성들로만 구성되도록 테이블을 분해해서 이상 현상이 발생하지 않도록 하는 것.

정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는 것이다. 그럼으로써 무결성을 유지할 수 있으며 DB의 저장 용량도 줄일 수 있다.
하지만 중복을 완전히 없앨 수는 없기에 최소화하는 방식으로 해야 한다.


이상 종류

  • 삭제 이상 - 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상.
    • 학생번호 402 장미란 선수의 튜플을 삭제하면 “스포츠 경영학” 수업은 존재하지 않게 된다.

  • 삽입 이상 - 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상

    • 신입생 601 Q가 추가된다면, 아직 강좌등록을 안하여 “강좌이름”, “강의실”이 NULL 이 된다..

  • 수정 이상 - 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상

    • 501 박지성 학생이 듣는 강의 중 데이터베이스 강의가 공학관 110호 에서 201호로 바뀌었는데, 같은 수업을 듣는 김연아 학생의 데이터베이스 강의는 여전히 공학관 110호에서 진행된다고 표기



🏷️ 제1 정규화


릴레이션의 모든 속성 값이 원자값을 갖는 경우다.


🏷️ 제2 정규화


제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
완전 함수 종속이란 기본키의 부분집합이 결정자가 되어선 안 된다는 것을 의미한다.
이게 무슨 뜻이냐면 기본키가 종속자고 이 기본키가 여러 속성으로 구성되어 있을 경우 기본키를 구성하는 모든 속성이 포함된 부분집합 또는 종속자일 경우를 말한다.


그림으로 제2 정규화 완료


🏷️ 제3 정규화

같은 값(피결정, 아래 예시에선 수강료)을 바라보는 다수 결정자들 분리 (이행적 종속 분리)
이행적 종속 분리란 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미.

501번 학생이 수강하는 강좌가 스포츠경영학으로 변경되었다고 하면 501번의 학생은 스포츠경영학이라는 수업을 20000원이라는 수강료로 듣게 된다.

기본 키(primary key)가 아닌 속성(Attribute)들은 기본 키에만 의존해야 한다.



🏷️ BCNF

모든 결정자가 후보키가 되도록 테이블을 분해하는 것
릴레이션 R에서 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키인 정규형.


기본키는 (학생번호, 특강이름)이다. 그리고 기본키 (학생번호, 특강이름)는 교수를 결정하고 있다. 또한 여기서 교수는 특강이름을 결정하고 있다.
문제는 교수가 특강이름을 결정하는 결정자이지만, 후보키가 아니라는 점.
그렇기 때문에 BCNF 정규화를 만족시키기 위해서 위의 테이블을 분해해야 한다.






📓 반/비정규화

하나 이상의 테이블에 데이터를 중복시키거나 그룹핑함으로써 데이터 베이스의 성능을 향상시키기 위한 기법.
읽는 시간을 최적화하도록 설계된 데이터베이스. 의도적으로 정규화 원칙을 위배하는 행위이다.

🏷️ 언제 사용?

  • 정규화에 충실하여 종속성, 활용성은 향상 되었지만 수행속도가 느려진 경우
  • 다량의 범위를 자주 처리해야하는 경우
  • 특정 범위의 데이터만 자주 처리하는 경우
  • 요약/집계 정보가 자주 요구되는 경우
  • 성능 상 이슈가 있을 경우

🏷️ 주의점

  • 반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있다
  • 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있다.
  • 중복 컬럼 허용 : 매우 빈번하게 조회되는 컬럼이 서로 다른 테이블에 있다면 컬럼을 한 곳에 두어라.
  • 유도 컬럼 생성 : SUM 함수처럼 쿼리의 결과가 하나의 열, 하나의 행인 경우 쿼리를 상수열로 사용할 수 있는 것을 의미.
    쉽게 말하면 다른 속성으로부터 유도된 속성
    ex) "판매 가격"과 "구매 가격"이라는 두 컬럼이 있을 때, 이 둘의 차이를 나타내는 "이익"이라는 유도 컬럼을 만들 수 있다.
    유도 컬럼을 사용하면 매번 "이익"을 계산하기 위해 별도의 쿼리를 실행할 필요 없이, 빠르게 정보를 얻을 수 있다.
    ex) 한 사람의 속성에 생년월일이 있고, 나이가 있다면, 나이는 생년월일을 통해 계산될 수 있으므로 유도속성이다.





Reference

🔗 https://mangkyu.tistory.com/110
🔗 https://mangkyu.tistory.com/28
🔗 https://ccho.tistory.com/9

👍 **정말 좋은 링크** : DB 설계를 처음부터 할 일이 생긴다면 한번 쯤 살펴 보자.
profile
일상의 인연에 감사하라. 기적은 의외로 가까운 곳에 있을지도 모른다.

0개의 댓글