[DB] 릴레이션의 분석 지침, 함수적 종속성

calis_ws·2024년 2월 27일
0

데이터베이스 릴레이션 분석은 데이터를 적절하게 구조화하여 중복을 최소화하고 데이터의 무결성을 보장하는 과정이다. 이를 위해 정규화와 함수적 종속성을 이해하고 적용해야 한다.

릴레이션이란?

릴레이션(relation)은 데이터베이스에서 정보를 구분하여 저장하는 기본 단위이며, 엔티티에 관한 데이터를 데이터베이스에서 릴레이션에 담아서 관리한다.

릴레이션은 일종의 표 형태로, 행과 열의 집합으로 구성된다. 각 행은 레코드나 튜플이라고 불리며, 각 열은 속성(attribute)이라고 불린다.

RDBMS에선 릴레이션을 테이블 이라 하며, NoSQL에선 컬렉션 이라 부른다.

함수적 종속성(Functional Dependency)

완전 함수적 종속(Full Functional Dependency)

완전 함수적 종속이란, 종속자가 기본키에만 종속되며, 기본키가 여러 속성으로 구성되어 있을경우 기본키를 구성하는 모든 속성이 포함된 기본키의 부분집합에 종속된 경우이다.

해당 릴레에션의 기본키는 '고객ID'와 '상품코드' 속성으로 구성되어 있다. 여기서 '수량' 속성은 기본키를 구성하는 '고객ID', '상품코드' 속성을 모두 알아야 식별할 수 있다. 따라서 '수량'은 완전 함수 종속된 관계이다.

부분 함수적 종속(Partial Functional Dependency)

부분 함수적 종속이란, 릴레이션에서 종속자가이 기본키가 아닌 다른 속성에 종속되거나, 기본키가 여러 속성으로 구성되어 있을경우 기본키를 구성하는 속성 중 일부만 종속되는 경우이다.

기본키가 '고객ID' 와 '제품코드' 속성으로 구성된 위의 릴레이션에서 '주문상품'은 기본키 중 '제품코드'만 알아도 식별할 수 있다. 이 경우에는 '주문상품' 속성은 기본키에 부분 함수 종속된 관계이다.

제1 정규형(1NF)

릴레이션을 구성하는 모든 도메인이 원자값으로 된 정규형

제2 정규형(2NF)

제1 정규형을 만족하면서 릴레이션에 존재하는 부분 함수적 종속을 제거하여, 모든 속성이 기본키에 완전 함수 종속이 되도록 만들어진 정규형

이행적 함수 종속(Transitive Functional Dependecy)

릴레이션에서 X, Y, Z라는 3 개의 속성이 있을 때 X→Y, Y→Z 이란 종속 관계가 있을 경우, X→Z가 성립될 때 이행적 함수 종속이라고 한다. 즉, X를 알면 Y를 알고 그를 통해 Z를 알 수 있는 경우를 말한다.

이 릴레이션에서 '상품번호'를 알면 '소분류'를 알 수 있고, '소분류'을 알면 '대분류'도 알 수 있다. 따라서 '상품번호'를 알면 '대분류'를 알 수 있으므로 이행적 함수 종속 관계이다. 이 때, 대분류는 소분류에 의해 관계되는 항목이지만, 상품번호를 통해 귀속되어있다. 따라서 이런 관계를 이행적 함수 종속이라고 한다.

제3 정규형(3NF)

제2 정규형을 만족하면서 릴레이션을 구성하는 속성들 간의 이행적 종속관계를 분해하여 속성들이 비이행적 함수 종속관계를 만족하도록 만들어진 정규형

릴레이션의 분석 지침

릴레이션이 잘 설계되었는지, 문제는 없는지 간단히 확인하는 기본 지침

기본 지침을 체크해보면, 잘 설계되었는지 대략적으로 확인할 수 있다.

1. 스키마에서 속성의 의미가 명확한지 확인한다.

속성의 이름을 의미적으로 모호하지 않게 작명해야 한다.

-> 회원 테이블의 경우, 날짜 시간 이라고 작명하기 보다는, 더 명확하게 가입 날짜 시간 이라고 작명해준다.

-> 게시글 데이터를 저장하기 위해 만든 게시글 릴레이션에는 게시글과 관련된 속성만 존재하게 한다.

위 예시처럼, 게시글 번호 를 기본키로 하는 게시글 릴레이션에 회원번호 작성자 이름 작성자 생년월일 등과 같은 게시글과 관계가 먼 속성들이 존재하여 데이터가 중복되는 부분들이 많이 생기면 메모리 문제, 중복 문제 뿐만 아니라 다른 문제도 야기할 수 있다.

2. 튜플들에서 중복되는 값들이 있는지 확인한다.

삽입 이상

실수로 작성자의 이름을 김수민으로 잘 못 입력될 수 있다. 나중에, 릴레이션의 튜플들을 확인했을 때, 회원 번호 1번이 김민수 인지 김수민 인지 확실하게 알 수 없어 릴레이션의 신뢰성을 잃게된다.

수정 이상

회원 번호 1번인 회원의 이름을 특정한 이유로 일부만 변경되었을 때(실수로) , 삽입 이상 때와 같은 이유로 릴레이션의 신뢰성을 잃게된다.

삭제 이상

3번 게시글 튜플을 삭제 시, 게시글과 관련된 제목 , 내용 과 같은 데이터는 이유가 있어 삭제했다고 해도, 회원과 관련된 데이터도 모두 사라지게 된다. 이는, 데이터 누락을 야기하게 된다.

3. 튜플들에 저장된 NULL 값을 확인한다.

속성에 NULL 값이 빈번하게 저장되면, 불필요한 저장 공간을 사용하게 된다.
-> 속성에 빈번하게 NULL 값이 저장된다는 의미가, 불필요한 정보라는 의미로 받아들일 수 있다. 따라서, 메모리 관점에서 이러한 속성이 해당 릴레이션에서 필수적인 속성인지 검토해볼 필요가 있다.

NULL 값이 존재하면, 튜플의 의미가 모호해지거나 통계적 관점에서도 쓸모없는 데이터가 되어버리기 때문에, 별도의 릴레이션으로 분리하는 것을 고려하는 것이 좋다.

4. 가짜 튜플이 생성되는지 확인한다.

위와 같은 경우가 릴레이션을 잘못 분리한 예시이다.

릴레이션을 분리했다가 다시 합쳤을 뿐인데, (0003,데이터베이스,A0003) 과 같은 이전에는 존재하지 않았던 튜플이 생성되었고, 이를 가짜 튜플 이라고 한다.

이처럼, 릴레이션을 적절하게 분리하지 않거나, 잘못된 설계를 하면, 두 릴레이션을 JOIN 할 시 가짜 튜플 을 만들어 낸다.


정리

정규화

  • 제2 정규형 : 릴레이션에 존재하는 부분 함수적 종속을 제거하여, 모든 속성이 기본키에 완전 함수 종속이 되도록 만들어짐

  • 제3 정규형 : 릴레이션을 구성하는 속성들 간의 이행적 종속관계를 분해하여 속성들이 비이행적 함수 종속관계를 만족하도록 만들어짐

릴레이션의 분석 지침 4가지

  • 릴레이션의 속성이 명확하게 작명되었는지 확인

  • 릴레이션의 데이터가 중복되는 부분이 많은지 확인

  • 속성 데이터가 NULL 값이 빈번하게 존재한다면, 필요한 속성인지 검토

  • 릴레이션 분리 시, 적절하게 분리되어 가짜 튜플을 생성하지 않는지 확인

출처

https://dodo000.tistory.com/20
https://swingswing.tistory.com/15
https://inkyu-yoon.github.io/docs/Learned/DataBase/RelationRule#1-스키마에서-속성의-의미가-명확한지-확인한다

profile
반갑습니다람지

0개의 댓글