이상현상을 해결하기 위해서 정규화를 해야한다는 것을 앞선 포스팅에서 확인할 수 있었습니다.
이러한 이상현상이 발생하는 원인은 하나의 릴레이션에 무리하게 많은 속성들을 넣으려다 보니 생겨난 것입니다.
따라서 연관관계가 높은 속성들만 모아 릴레이션을 분해하는 것이 필요하다는 것을 알 수 있습니다.
그렇다면 어떻게 연관성이 높은지를 판단할 수 있을까요?
바로 함수 종속성이라는 개념을 통해 연관성이 높은지 낮은지 판단하게됩니다.
그리고 결론적으로 말하자면, 이상현상을 방지하려면 속성 사이의 연관관계, 즉 종속성(dependency)를 분석하여, 하나의 릴레이션에는 하나의 종속성만 표현되도록 릴레이션을 분할하면 됩니다.
그리고 단계적 규칙에 따라 릴레이션을 분할하는 과정을 정규화(Normalization)이라고 합니다.
갑자기 많은 내용을 말한 것 같습니다. 천천히 하나씩 알아가 봅시다.
일단 함수 종속성 정의를 알아봅시다.
정의: 한 릴레이션 안의 속성 간에 특정 속성값이 함수적으로 다른 속성 값을 결정하는 종속관계를 뜻합니다. 쉽게 A 속성을 알면 다른 속성 B, C를 알 수 있게 되는 관계를 함수 종속성이라고 합니다.
말로는 어려우니, 예를 들어 알아봅시다.
릴레이션
학번(기본키) | 이름 | 전화번호 | 이메일 |
2020123 | 김철수 | 010-1111-1234 | kim@mail.mail |
2020124 | 김서준 | 010-1111-1235 | kim1@mail.mail |
2021445 | 이서아 | 010-1111-1236 | lee@mail.mail |
2020145 | 김철수 | 010-1111-1237 | han@mail.mail |
위의 릴레이션에서 학번에 따라 이름, 전화번호, 이메일이 결정되게 됩니다. 이름은 동명이인이 있을 수 있습니다. 위의 예에서 김철수 라는 이름이 종복되므로, 김철수를 알아도, 해당 튜플의 학번이 2020123인지, 2020145인지는 알 수 없습니다. 하지만 학번을 알면 나머지 이름, 전화번호, 이메일은 반드시 유일하게 결정되게 됩니다. 이처럼 어떤 속성 값은 다른 속성 값을 고유하게 결정될 수 있습니다.
이처럼 속성2가 속성 1에 의해 결정된다고 할 때, 이를 속성1 → 속성 2 라고 표현하고, 속성1을 속성2를 결정하는 결정자, 속성 2를 속성 1에 의해 종속된 종속자라고 표현합니다.
결정자인 각 속성 1에 대해 반드시 속성2의 값이 하나식만 대응됩니다. 그리고 속성1과 속성2는 복합속성일 수 있습니다.
위 릴레이션에 존재하는 종속성을 모두 표현하면
학번 → 이름
학번 → 전화번호
학번 → 이메일
또는
학번 → (이름, 전화번호, 이메일)
이렇게 표현할 수 있습니다.
위 릴레이션에서도 보셨겠지만, 보통 튜플을 유일하게 식별하는 기본키 혹은 후보키는 다른 모든 속성들을 함수적으로 결정하므로 결정자가 됩니다. 또한, 기본키나 후보키가 아닌 일반 속성도 결정자가 될 수 있습니다.
그리고 함수 종속성을 판단할 때 현재 릴레이션에 저장된 속성 값만을 가지고 판단하지 않도록 주의해야 합니다. 릴레이션 안의 속성 값은 계속 변할 수 있습니다. 함수 종속성은 릴레이션의 모든 가능한 경우에 대해 충족되어야 합니다. 결국 속성 값보다는 속성 자체의 의미로 종속 여부를 판단해야 합니다.
내용이 조금 어려우셨을수도 있을 것 같습니다. 우선은 아래의 정리만 이해하면 됩니다.
이어지는 포스팅에서 추가적으로 설명드릴 예정입니다.
그럼 다음 포스팅에서는 함수종속에 존재하는 완전 함수 종속과 부분 함수 종속 등을 설명드릴 예정입니다.
정리
이상현상이 발생한 원인은 하나의 릴레이션에 많은 속성을 무리하게 담아놓았기 때문입니다.
따라서 릴레이션을 분해해야 하는데, 분해해가는 과정을 정규화라고 합니다.
그러면 어떻게 분해해야 할까요?
⇒ 연관성이 높은 속성끼리 묶어서 릴레이션을 분해해가야 합니다.
그러면 어떻게 연관성이 높은지 알 수 있을까요?
⇒ 함수 종속성을 통해 알 수 있습니다.
그러면 함수 종속성이란?
⇒ 속성 A에 따라 속성 B가 결정되는 관계. (예: 학번을 알면 이름, 전화번호가 유일한 값으로 결정되게 됩니다.)
그래서 결론적으로
이상현상을 방지하려면 속성 사이의 연관관계, 즉 종속성(dependency)를 분석하여, 하나의 릴레이션에는 하나의 종속성만 표현되도록 릴레이션을 분할하면 됩니다.
참고: MySQL과 모바일 웹으로 만나는 데이터베이스의 정석을 읽고 정리하고 있습니다!
'CS' 카테고리의 다른 글
데이터베이스 이상 현상 (0) | 2021.10.12 |
---|