데이터의 구조가 정확하지 않다면 지원되는 여러 관리기능에도 불과하고 데이터의 일관성, 무결성 유지가 힘들다. 따라서 효율적인 데이터 구조를 만들어야 한다.
모델링 과정을 거치더라도 데이터의 형태, 입력되는 데이터의 양상에 따라서 때로는 효율적이지 않은 구조일 수 있다. 데이터를 살펴보고 이 데이터에 해당 구조가 적절한지 판단할만한 기준이 필요한데, 이를 "정규화" 라고 한다.
릴레이션 => 논리적 모델링 데이터단계에서 수행하는 것.
💬 이 릴레이션은 아무 문제가 없는 릴레이션일까?
✔️ 등급이 GOLD이면 5% 할인율을, VIP는 10%의 할인율을 가진다는 측면에서 서로 다른 컬럼에서 부분적인 중복이 발생하고 있다. 정규화는 이러한 부분적인 중복을 문제삼고자 하는 것이다. 중복이 되기 때문에 저장 공간의 낭비가 일어나고, 만약 유관순 고객의 할인율만 8%로 변경하는 경우 DBMS의 입장에서 GOLD의 할인율을 혼동하는 등의 문제가 발생 가능하다.
3%의 할인율을 가진 NEW라는 등급을 추가하고자 할때, 테이블의 기본키가 고객번호이므로 고객번호, 고객명, 전화번호등 불필요한 정보들을 함께 저장해야만 한다는 단점이 있다.
이번엔 NEW라는 등급과 그 할인율 3%만 삭제하고 싶은데, 앞의 윤봉길이라는 고객정보를 없애지 않으면 삭제하고자 하는 정보를 삭제할 수 없게 된다.
회사의 정책변경으로 VIP의 할인율을 8%로 줄일때, 일부 누락되어 안중근의 할인율 변경이 누락된 경우 데이터의 비일관성을 야기할 수 있다.
컴퓨터 프로그래머적 관점에서의 모델링
어떻게 데이터를 저장해야 하는가?
릴레이션의 스키마가 얼마나 효율적으로 실세계를 반영하고 있는지 평가
고려사항
💬 그럼 분리, 통합 기준은 뭘까?
✔️ "함수적 종속성"을 논의함으로써 알 수 있다!
릴레이션 인스턴스를 분석하여 속성들간의 연관관계를 표현한 것.
인스턴스: 컬럼들만 나열된 스키마가 아니라, 특정 시점에 스키마에 맞춰 입력되어 있는 레코드의 상황
릴레이션의 효율성을 향상시켜 좋은 릴레이션으로 변환하는데 이용되는 중요한 개념
정의
임의의 릴레이션 스키마R의 인스턴스 r(R)에 포함되는 서로 다른 두 레코드 r1, r2와 컬럼집합 X와 Y에 대해, r1[x]=r2[x]일 때, r1[y]=r2[y]이면 함수적 종속성 X->Y가 성립한다.
X가 같을 때 Y가 같으면 함수적 종속성 만족
X가 같을 때 Y가 하나라도 다르면 함수적 종속성 불만족
X가 모두 다를 때 Y값의 일치 여부는 고려대상이 아님. 함수적 종속 만족
유관순, 안창호 2가지 경우에서 등급이 GOLD이니 할인율이 5%다.
손병희, 지청천, 안중근 3가지 경우에서 등급이 VIP니 할인율이 10%다.
특정 컬럼의 값이 같을 때, 해당 레코드의 다른 컬럼의 값들이 서로 일치한다. 따라서 한 컬럼의 값을 굳이 보지 않더라도, 특정 컬럼의 값을 알고 있으면 나머지 컬럼이 추론 가능함. = 함수적 종속
우리가 한 릴레이션의 함수적 종속성을 눈으로 하나하나 따져가며 골라낸 것을 F라고 이야기한다. 그럼 만약 수만개의 레코드가 있다고 할때, 우리가 눈으로 하나하나 다 골라내는것이 가능할까? 이런 경우 수학적 기법으로 더 찾아낼수도 있다! = 확장
- 재귀성 규칙 : 𝑋⊇𝑌이면, 𝑋→𝑌이다
- 부가성 규칙: 𝑋→𝑌이면, 𝑋𝑍→𝑌𝑍이다
- 이행성 규칙: 𝑋→𝑌이고, 𝑌→𝑍이면, 𝑋→𝑍이다.
- 분해 규칙: 𝑋→𝑌𝑍이면, 𝑋→𝑌이다.
- 합집합 규칙: 𝑋→𝑌이고, 𝑋→𝑍이면, 𝑋→𝑌𝑍이다.
- 의사 이행성 규칙 : 𝑋→𝑌이고, 𝑊𝑌→𝑍이면, 𝑊𝑋→𝑍이다
💬 고객번호는 고객명을 종속할까?
✔️ 같을때 같은가? 고객번호, 고객명의 중복이 없으므로 같은게 없다. 따라서 종속한다. 하나의 고객번호에 하나의 고객명으로 정해진다. 함수적으로 종속한다.
💬 고객명은 등급에 종속할까?
✔️ 같을때 같은가? 그렇다. 따라서 함수적으로 종속한다. 중요한건 같을때 같은지를 보는거지, 같지 않을때 어떤지는 중요하지 않다. 중복되는 유관순은 없고, 단 하나뿐인 유관순의 등급이 GOLD이므로 같을때 같다고 볼 수 있다. 따라서 종속한다!
💬 {고객번호, 고객명}은 할인율에 종속한다.
✔️ 고객번호와 고객명의 쌍이 같은 레코드가 없다. 따라서 할인율이 같든지 말든지 고려할 이유가 없음. 따라서 종속성은 참이다.
⭕️ 결과적으로, 고객번호는 {고객명, 등급, 할인율}에 종속한다.
함수적 종속성 추론 규칙으로 확장된 클로저에는 자명한 종속성과 중복된 종속성을 포함한다는 문제점이 있다.
불필요한 함수적 종속성을 제거한 표준형으로 변환 후 정규화를 수행
표준형 조건
이같은 표준형의 과정을 거쳐 불필요한 함수적 종속성을 가지치키 한 것을 카노니컬 커버라 하고, 다음과 같이 표기함.
정규화는 정규형을 만들어내기 위함. "어떤 릴레이션이 정규형을 만족해? 그럼 정규화를 거쳐서 정규형을 만족하도록 만들어야지!" = 정규화
가면갈수록 제약조건이 까다로워지고 효율성이 높은 릴레이션이됨. 일반적으로 현업에서는 제4, 제5 정규형까지는 하지 않는다.
정의
특정 정규형의 조건을 만족하도록 릴레이션과 속성을 재구성하는 과정
DB 모델링 시, "사용자 요구 분석> 개념적 데이터모델링 > 논리적 데이터모델링 > 정규화 > 물리적 구현"으로 정갈하고 효율적인 릴레이션 스키마 제작 가능!
정의
릴레이션 스키마에서 정의된 모든 속성의 도메인이 원자값을 갖는 상태
컬럼값의 원자성 성립 = 제 1 정규화 성립
콤마, 파이프 등 구분자 특수기호를 사용하여 하나의 컬럼값에 여러가지 의미를 넣는 경우가 있음. 이는 관계형 모델 사용 자체의 문제가 발생할 수 있으므로 권장되지 않습니다!
김규식 관리자가 관리하는 도크에 대해 어떤 배가 입항시간이 언제이고 출항시간이 언제인지 유추할 수 없다. 각각 값의 정확한 매칭을 알 수 없으므로 항상 원자값을 가져야 한다.
예제를 직접 보기전에 배경지식 설명.
거대한 배를 수입, 수출할때 외국의 바다 환경까지 정확히 알기 힘들어 거대한 배의 주차문제를 도와주는 작은 차들이 있고, 주체를 도와 지시하는 관리자도 있음. 이에 관해 릴레이션을 만들어 볼 것.
Q. 도크번호는 도크관리자를 종속하는가?
A. O. 항상 특정 도크번호에 따라 같은 도크관리자가 같다.
Q. 목적이 담당관리자를 종속하는가?
A. O. 같을때 같은지만 고려하면 된다. 다를때 어떤지는 고려할 필요 없다.
Q. 목적이 도크번호를 종속하는가?
A. O. 이하동문
위의 릴레이션에서 못해도 8개, 9개의 함수족 종속성을 찾을 수 있음. 이를 쫙 나열하면 이해하기 힘들고 직관성이 떨어진다. 이를 이해하기 쉽게 도식화할 수 있다!
화살표의 시작과 끝을 잘 파악해야 한다!
{도크번호, 입항시간}이 같이 출항시간을 종속.
정의
주어진 릴레이션의 인스턴스가 기본키가 아닌 속성들이 기본키에 완전히 종속되어 있는 상태.
아무렇게나 분해하면 될까? 그럼 손실 분해가 일어날 수 있다. 필요에 의해 레코드를 구분하여 두개의 테이블을 생성하고, join을 통해 묶어서 결과를 도출해야 하는데, 분해한 릴레이션을 다시 join했을 때 분해 전의 릴레이션으로 돌아가지 못하는 것을 손실분해라 한다.
X가 Y를 종속할때, 서로 같은 컬럼을 공유하지 않으면, Y만 떼어낸 릴레이션과 X와 Y컬럼으로만 구성된 두개의 릴레이션으로 분해해도 아무런 문제가 발생하지 않는다.
도크관리 - {도크관리자}(R-Y, 릴레이션에서 도크관리자 제거.),
{도크번호, 도크관리자}(XY)
두개의 다이어그램(릴레이션)으로 분리. 제 2정규화의 조건. 모든 키가 아닌 속성들이 기본키에 종속되어 있는가? 라는 질문에 성립한다.
정의
릴레이션이 제2정규형을 만족하고, 기본키가 아닌 속성들이 어떤 키에도 이행적으로 종속되지 않은 상태
이행적 종속성 : 𝑋 → 𝑌이고 𝑌 → Z이면. 𝑋 → Z이다.
이행적 종속성이 있으면 부분적 종속성이 발생하니, 이행적 종속성을 끊어내야 한다. 어떻게 해야 할까? "담당도선사"만 빠져나가면 된다.
위의 도크 릴레이션에서 목적 -> 담당도선사를 따로 빼내어 부분 종속성을 제거할 수 있다.
결과물 자체가 효율적이지 않아 보이더라도, 데이터가 수백, 수천만개가 될때를 고려해서 생각해보면 효율성극대화 될 것임을 알 수 있다.
정의
릴레이션이 제 3정규형을 만족하고 릴레이션에 성립하는 X->Y형태의 모든 함수적 종속성에 대하여 X가 슈퍼키인 상태
기본키가 아니며, 슈퍼키도 아닌 일반 속성인 {목적}이 도크번호라는 속성을 종속하고 있다. => BC정규형을 위반
목적이 결정자고, 도크번호가 종속자이므로 기본키의 도크번호가 목적으로 대체됨. 결과적으로 하나의 릴레이션이 4개로 나뉘게 된다.
<제 1 정규화가 이루어진 릴레이션>
< BC정규화까지 거친 릴레이션 >
정보 손실없이 무손실로 정규화를 거쳤기 때문에 JOIN을 이용하면 정규화 이전으로 데이터 손실없이 돌아갈 수 있다!
역정규화: 정규화의 반대. 분할한 릴레이션을 다시 원래로 돌리는 것
(조인은 DBMS에 많은 내부연산을 유발하는 명령어중 하나. 사용자가 무언가를 요구할 때 많은 시간을 요구한다. 실제 현실에서는 이론이 아니라 성능, 퍼포먼스가 중요할때가 많다. 빠른 검색이 가능한 환경을 구성하기 위해선, 이러한 정규화를 다시 역정규화 하는 과정이 필요하다.)
아... 정규화진짜 너무 헷갈린다.
📌 정규화
- 제 1 정규형: 릴레이션 스키마에서 정의된 모든 속성의 도메인이 원자값을 갖는 상태. (=컬럼값의 원자성 성립)
- 제 2 정규형: 주어진 릴레이션의 인스턴스가 기본키가 아닌 속성들이 기본키에 완전히 종속되어 있는 상태. (기본키에 완전히 종속되도록 릴레이션을 구분한다.)
- 제 3 정규형: 제 2정규형 만족 & 기본키가 아닌 속성들이 어떤 키에도 이행적으로 종속되지 않은 상태.
- BC 정규형: 제 3정규형 만족 & X->Y 함수적 종속성 만족 시 X가 슈퍼키(유일성)인 상태.
으으 머리아퍼