Develop/Database

데이터베이스 모델링(4) - 논리 모델 (이상, 정규화)

YOOZI. 2024. 12. 31. 08:45
728x90

 

모델이 개념을 가졌으니, 논리가 담긴 발언을 하는 것인가..?

 

 

오늘은 데이터베이스 설계에서 중요한 개념인 이상(Anomaly)과 정규화(Normalization)에 대해 공부해 보자.

오늘의 배움
  • 이상이란 무엇인지
  • 이상의 종류: 삽입, 갱신, 삭제 이상
  • 정규화의 정의와 목적
  • 정규화의 종류와 단계

 


이상 (Anomaly)

중복된 데이터 때문에 데이터에 의도하지 않은 현상이 발생되면 이를 이상 현상이라고 한다. 이상 현상에는 삽입 이상, 갱신 이상, 삭제 이상이 존재한다.

 

1. 삽입 이상(Addition Anomaly)

  • 새로운 데이터를 추가할 때 불필요한 정보를 함께 저장해야만 하는 현상이다.
  • 예시) 상품을 추가할 때, 주문 번호나 수량 같은 불필요한 정보를 입력해야 한다면, 이는 삽입 이상이 발생한 것이다. 마치 새로운 디자인 요소를 추가할 때 기존의 모든 요소를 다시 정리해야 하는 것과 비슷하죠.

2. 갱신 이상 (Update Anomaly)

  • 중복된 데이터 중 일부만 수정할 때 발생하는 문제로, 데이터의 불일치가 생기는 현상이다.
  • 예시) 같은 상품의 가격을 여러 곳에서 수정해야 할 때, 한 곳만 수정하면 나머지 데이터와 불일치가 발생한다.

3. 삭제 이상 (Deletion Anomaly)

  • 데이터를 삭제할 때 유용한 정보까지 함께 삭제되는 현상이다.
  • 예시) 특정 주문을 삭제하려고 할 때, 그 주문에 관련된 상품 정보도 함께 사라져 버리는 경우. 이는 마치 디자인 프로젝트에서 특정 레이어를 삭제했을 때, 그 레이어에 포함된 모든 요소가 사라지는 것과 유사하다...(그 상황만은... 안돼에에...!!)

 

데이터베이스에서도 중복을 피하고, 필요한 정보를 명확히 관리하는 것이 중요하다.


 

논리 모델 (Logical Model)

논리 모델은 개념 모델을 더 상세하게 만드는 작업으로, 전체 속성을 도출하고 엔터티와 관계를 명확히 하는 단계.

정규화(Normalyzation)를 진행하여 데이터의 구조를 개선하는 과정이 포함된다.

 

목적

논리 모델의 주된 목적은 업무에 대해 충분히 의견을 교환하고 중복값을 제거하여 이상 현상을 해결하는 것. 이를 통해 속성 간의 종속 관계를 확인하고 엔터티를 분할하게 된다.

예시를 들자면,

팀에서 피드백을 주고받으며 최종 프로젝트 안을 결정하는 것처럼, 논리 모델에서도 여러 의견을 반영하여 최적의 데이터 구조를 만드는 과정이 중요한 것이다.

 

주의사항

  1. 정확한 반영: 업무 요건을 빠짐없이 반영
  2. 엔터티와 속성 관리: 더 이상 삭제할 엔터티나 속성이 없어야 함
  3. 효율성 고려: 주 식별자는 효율성에 따라 결정
  4. 성능 문제 주의: 지나치게 성능 문제를 해결하려고 하지 않음

 


 

정규화 (Normalization)

정규화는 중복 데이터를 제거하여 데이터베이스의 안정성과 확장성을 높이는 과정이다.

정규화의 목적

  • 안정성: 데이터의 성격에 맞는 엔터티를 도출하여 모델 구조를 정의
  • 확장성: 데이터의 정체성이 반영되어 업무가 수정되더라도 쉽게 반영

함수 종속

함수 종속은 릴레이션 내 속성 간의 종속성을 의미한다. 대표 속성이 나머지 속성을 유일하게 식별할 수 있을 때, 이들 간의 관계가 성립하게 된다.

 

예를 들자면,

상품 ID가 상품명이나 가격을 유일하게 식별할 수 있는 경우, 상품 ID는 함수적으로 종속된다고 할 수 있다.

 

정규화의 종류

제1 정규형(1NF):

  • 모든 속성은 반드시 하나의 값을 가져야 하며, 다가 속성과 복합 속성을 처리해야 합니다.
    • 다가 속성 : 하나의 인스턴스에 하나의 속성이 여러 값을 가지게 되는 속성
    • 복합 속성 : 여러 속성이 하나의 속성으로 묶여있는 속성
  • 예시) 하나의 상품이 여러 카테고리에 속할 경우, 별도의 엔터티로 분리하여 1대 다 관계로 처리하는 것이 좋다.

제2 정규형(2NF):

  • 1NF를 만족해야 합니다
  • 부분 함수적 종속성을 제거합니다
  • 모든 비주요 속성이 주요 키에 완전 함수적 종속이어야 합니다. (예시: 주문정보에서 상품가격이 상품번호에만 종속되는 경우 분리)

제3 정규형(3NF):

  • 2NF를 만족해야 합니다
  • 이행적 함수적 종속성을 제거합니다
  • 비주요 속성들 간의 종속성을 제거합니다. (예시: 우편번호가 도시를 결정하고, 도시가 다시 지역을 결정하는 경우 분리)

BCNF(Boyce-Codd Normal Form):

  • 3NF를 만족해야 합니다
  • 모든 결정자가 주식별자가 되어야 합니다
  • 제3 정규형보다 더 엄격한 제약조건을 가집니다

 

 


정규화 실습 (feat. DA# 설치)

DA#을 이용하여 정규화를 실습해 보자.


 

더보기

참고) DA# 설치

 

1. 새로 만들기 -> '논리, 물리', 'MySQL' 설정하여 확인!

오른쪽과 같이 사이드바에 생성됨

 

2. 엔터티 생성하기

 

3. 엔터티 창을 더블 클릭해서 -> 엔터티 편집창 뜸

 

4. 속성 편집

  • 속성명, 컬럼명: 영어로 작성, 대소문자 구분 없음
  • NotNull: Null값을 허용할거냐 안 할거냐
  • 길이: byte 수 (영어 - 한 글자당 1byte, MySQL에서 한글 - 한 글자당 3byte)

5. 관계선을 이용해 관계를 구분

fk로 변경됨

 

 

6. 이미지로 내보내기


 

Q1) 1 정규형

문제 상황 발생 - 연극출연자별급여의 중복값을 제거해야 함
- pk, notnull 값을 고려하자
해결 방안 다가 속성인 '출연진', '급여'를 다른 엔터티로 분리하자
결과 확인

 


 

Q2) 2 정규형

 

문제 상황 발생 - 날짜별회원섭취칼로리 라는 것을 고려해 엔터티를 나눈다.
- pk, 큰 엔터티를 무엇을 나눌지 고려한다.
해결 방안 - 회원, 날짜별 칼로리로 나눠보자.
- 날짜별 칼로리에서 음식으로 세분화하자.
결과 확인

 

 


 

실제로 데이터베이스 모델링을 해보면서 많은 멘붕을 느꼈다....

도대체 이게 뭐 어쩌라는 거지..?.... 어떻게 하라고요..?..

 

근데 중복된 값을 제외한 나머지 값(인스턴스)을 중복된 속성의 엔터티명으로 분리하고

큰 문제에서 또 발췌되는 애들을 나열하다 보니 풀이를 시작할 수 있을 정도는 된 것 같다!

(맞겠지.?..ㅋㅋ)

 

다음시간엔 '데이터베이스-물리모델'에 대해 알아가자.

 

728x90