컴퓨터공부

데이터베이스론 정리 (2/3) 데이터베이스 설계

E.K.Lim 2019. 1. 4. 17:08

데이터베이스 설계

엔터티

서브타입

  • 서브타입 생성 유형
    1. 엔터티에서 인스턴스를 분류하여 서브타입을 생성하는 경우
    2. 성질이 서로 다르거나 유사한 엔터티를 통합하여 서브타입을 생성하는 경우

엔터티의 종류

  • 핵심 엔터티
    • 업무 행위에 대한 육하원칙 요소, ‘업무 수행 개체’가 추상화되어 모형화된 것
      • 행위주체, 행위시간, 행위 장소, 행위 대상이나 목적물, 행위 방법, 행위 근거나 동기
    • 가장 중요하므로 먼저 도출하고 확정
  • 행위 엔터티
    • 관리 대상 업무 행위를 추상화하여 표현한 엔터티
    • 항상 부모 엔터티를 가짐
  • 부수 엔터티

    • 개체 엔터티나 행위 엔터티에 종속되어 보조적이고 부수적인 정보를 표현
    • ~상세, ~내역, ~정보 등의 명사 형태로 주로 표현
    • 관계 엔터티나 코드 엔터티도 부수 엔터티에 해당
      • 대부분의 부수 엔터티는 자식 역할 vs. 코드 엔터티는 부모 역할
  • 논리적 성격의 엔터티 모델링하기

    1. 업무 행위를 의미하는 행위 엔터티 구성 (보험계약)
    2. 행위 주체를 의미하는 물리적 성격의 엔터티 구성 (고객)
    3. 행위 엔터티와 물리적 엔터티 사이에 탄생되는 자식 엔터티를 논리적 성격의 엔터티로 구성 (계약자)

속성과 식별자

도메인

: 속성 값으로 올 수 있는 값들의 집합

  • 도메인명: 단일어로서 소속된 속성들의 공통적인 성격을 의미할 수 있는 명칭
  • 도메인 유형: 범위형, 형식형, 열거형 도메인
    • 범위형 도메인: 데이터의 길이가 제한되는 도메인 (주문수량, 청구금액 등)
    • 형식형 도메인: 속성값이 특정 포맷을 가지는 도메인 (주민등록번호)
    • 열거형 도메인: 속성값이 열거된 값들로 제한되는 도메인 (성별)
  • 도메인 구성 및 사용 방법
    1. 모든 엔터티에서 사용되는 각 속성의 데이터 형식을 조사하여 도메인 유형 결정 및 데이터 길이 조사
    2. 도메인 유형&데이터 길이 순으로 오름차순 정렬
    3. 각 속성의 의미를 파악하여 도메인별 그룹핑하고 도메인 유형과 데이터 형식을 결정, 적합한 도메인명 부여
    4. 동일한 방법으로 모든 속성들에 대해 도메인 결정 후 도메인별 데이터 규칙 결정
    5. 결정된 내용을 기반으로 도메인 사전 구성

속성의 종류

  • 고유 속성: 엔터티 자신을 표현하는 속성. 주로 명칭, 내용, 특성 등
  • 추출 속성: 자신이나 다른 엔터티로부터 가공된 속성 (e.g. 집계 속성)
  • 관계 속성: 부모에게 상속받은 속성(e.g.주문고객번호: 고객번호에서 상속)

식별자

  • 본질 식별자: 인스턴스의 탄생 근거를 명확히 하기 위해 사용
    • 탄생번호의 의미를 가진 인위적인 속성을 추가하여 사용하기도 함
    • 서브타입의 본질 식별자는 슈퍼타입 측면에서 구성 (‘정규직 사원’의 속성은 ‘사원’에서)
  • 실질 식별자의 구성 방법
    • 본질 식별자 속성들로 구성
    • 인위적인 속성을 추가하여 구성(인조 식별자)
    • 본질 식별자 속성들과 인위적인 속성을 조합하여 구성
  • 대체 식별자를 사용하는 경우
    • 실질식별자 대신 자식에게 상속하여 대체 역할 (비정규화 방지)
    • 서브타입 인스턴스 식별 (고객 중 ‘개인고객’의 주민등록번호를 고객번호 대신 사용)
    • 속성 값의 중복 방지(고객번호 대신 id 사용)

관계 및 정규화

관계

  • 식별 상속과 비식별 상속
    • 식별 상속: 자식 엔터티가 상속받은 식별자 속성을 자신의 실질 식별자 일부로 사용 (자신의 관계선에 UID bar 그려서 표기): 주문-주문상세, 자식은 필수 관계
    • 비식별 상속: 상속받을 식별자 속성을 일반 속성으로 사용: 부서-사원
  • 직접 상속과 간접 상속

    • 직접 상속: 상대 엔터티의 식별자 속성들의 정보가 있는 경우
    • 간접 상속: 식별자 속성들의 정보는 없지만 간접적인 경로를 통하여 상속
  • 다양한 관계

    • 순환 관계: 어떤 엔터티가 자신을 부모로 하여 관계를 맺고 있는 것(e.g.계층 관계)
    • BOM(Bill Of Material) 관계: 하위부품-상위부품-제품 관계(M:N 순환 관계)
  • 배타적 관계[고객 내 개인-법인으로부터 상속받는 ‘계좌’]의 성질과 특징들

    • 자식 엔터티(계좌)는 반드시 하나
    • 각 부모로부터 상속받는 속성의 수는 모두 동일 (식별자만? 아니어도?)
    • 각 부모로부터 상속받는 속성들의 데이터 형식이 호환성이 있어야 함
    • 자식 엔터티는 부모 엔터티들로부터 상속받는 상속 유형이 모두 동일하도록 상속
    • 배타적 관계에 속해 있는 임의의 관계는 다른 관계에 속할 수 없음
    • 자식 엔터티의 참여도와 부모 엔터티의 참여도는 달라도 됨: 가능하면 동일하게!
    • 배타적 관계는 서브타입과 혼돈하지 말 것(배타적 관계는 부모-자식!)
    • 하나의 엔터티는 여러 개의 배타적 관계를 가질 수 있음
    • 일반적으로 상속-구분 속성을 사용
    • 배타적 관계의 아크는 자식 엔터티를 기준으로 그림
  • 다중 관계: ‘고객’과 ‘보험계약’의 두 엔터티 사이에서 ‘계약자’ ‘주피보험자’ ‘종피보험자’ 등의 많은 관계가 존재하는 경우

    • 병렬 관계: 많은 관계가 병렬적 관계선으로 존재하는 경우
      • 각 관계 속성에 각각 인덱스를 생성하여 인덱스가 증가할 확률이 높음
      • 각 관계가 자식 엔터티를 가질 수 없음
      • 업무가 변화되어 새로운 관계 추가시 테이블에 외래키 컬럼을 추가해야 함
      • 관계마다 전용 관계가 지정되어 해당 관계 속성으로 변환되는 것은 장점
    • 직렬 관계: 두 엔터티 사이의 관계를 모두 M:N의 하나의 관계로 표현
      • 교차 엔터티(e.g. 계약관련자)를 사용하여 비용은 증가
      • 교차 테이블의 행은 모두 관계에 관련되어 관리나 처리가 상당히 유리
      • 새로운 관계 추가시 서브타입만 삭제하거나 갱신: 유연성 증가
      • 관계가 자식 엔터티나 속성을 가질 수 있어 추가적인 처리가 가능

정규화

  • 엔터티들의 모든 속성이 항상 111 규칙을 만족
  • 자식 엔터티가 항상 부모의 식별자 속성을 상속
    -> 실무 현장에서 사용하는 제3정규형까지 자동적으로 만족!

이상 현상

  • 중복 데이터로 인해 데이터 변경 동작이 올바르게 동작하지 않는 현상
  • 테이블이 제대로 정규화되지 않아서 발생
  • 하나의 테이블에 성질이 다른 여러 인스턴스의 속성들이 혼재되어 있을 때 발생

  • 삽입 이상: 불필요한 어떤 데이터를 입력하지 않으면 필요한 데이터도 삽입되지 않는 현상

  • 삭제 이상: 삭제되어서는 안 되는 데이터까지 함께 삭제되는 현상

  • 갱신 이상: 여러 테이블에 중복되어 저장된 데이터를 갱신할 때 일부는 갱신되지 않는 현상

함수적 종속성

  • 어떤 속성이 기준 속성에 대해 종속되는 현상: 속성의 함수적 종속성
  • 엔터티에서는 식별자가 결정자, 일반 속성이 종속자가 됨 

정규형과 정규화

  1. 제1정규화

    • 엔터티에 속한 각 속성이 한 시점에서 하나의 원자값을 가지는 형태(111)를 만족하는 경우
    • 자식 엔터티를 생성하고 다중값 속성을 자식 엔터티로 이동시킴과 동시에 자신의 식별자를 상속
    • 주문과 주문 상세 분리
  2. 제2정규화

    • 엔터티에서 어떤 부분 종속도 발생하지 않는 형태
    • 부분종속되는 부분만 별도 분리하여 부모 엔터티로 하고, 부모 엔터티로부터 식별자 상속
    • 주문상세에서 제품 분리
  3. 제3정규화

    • 엔터티에서 이행 종속을 가지지 않은 형태
    • 이행 종속성 : ‘X->Y이고 Y->Z이면 X->Z 이다’ (X:사번(식별자), Y:근무부서번호, Z:부서명)
    • 이행 종속되는 부분을 부모 엔터티로 별도 분리하여 식별자를 상속받고, 부모엔터티의 식별자는 그 부분의 결정자로 함
    • 주문에서 거래처 분리

이력 관리

점 이력과 선분 이력

  • 점 이력: 데이터가 발생하거나 변경된 시간만을 관리하는 방식

    • 이력 데이터를 저장하고 이해하기는 용이하지만 과거 시점의 데이터를 재현하려면 비효율 발생
    • 로그성 데이터와 같이 조회 요구가 없이 쌓아두기만 해도 좋은 경우 사용
    • 함수나 서브 쿼리의 STOP KEY 기능을 사용하면 다소 성능 개선
  • 선분 이력: 데이터가 변경되어 유지되는 기간(시작시점과 종료시점)을 관리하는 방식

    • 이력 데이터를 저장하고 이해하기는 불리하지만 이력을 찾아 재현하고 활용할 때는 매우 효율적
    • 특정 통화의 환율이 변경되면 기존 적용 환율의 인스턴스 종료시각을 변경하고 새 인스턴스 생성
    • 종료시각은 ‘99991231’로 하여 지정한 기간동안 유지되도록 함

속성의 이력 관리

  • ‘무엇을 관리해야 할 것인가’: 이력대상 속성과 시간 속성, 발생 원인이나 관련 정보
  • 이력 엔터티의 실질 식별자의 선정: 새로운 실질 식별자 필요
  • 이력 모델링 방법
    1. 이력 엔터티를 생성하고 관리대상 속성들을 이력 엔터티로 이동
    2. 이력 엔터티의 관리대상 시간 속성에 대한 관리 방법을 결정하고 추가
    3. 이력 엔터티에게 식별자 속성들을 상속
    4. 이력 에터티의 실질 식별자 속성들을 결정
    5. 참고를 위해 필요한 데이터가 있으면 속성으로 추가

물리 데이터 모델

데이터 무결성 제약조건

  • 제약 조건

    • 엔터티 무결성 제약조건(=키 제약조건)
    • 도메인 무결성 제약조건: NOT NULL, DEAULT, CHECK 등
    • 참조 무결성 제약조건: FK, CASCADE, NULL
    • 사용자 정의 무결성 제약조건: 속성값 비교, 선분이력 중복검사 등을 위해 트리거로 처리
  • 처리 방법

    • 선언적 처리 방법: 테이블을 정의하면서 함께 제약 조건을 지정
    • 애플리케이션 처리 방법: 애플리케이션에서 미리 처리
    • 트리거링 처리 방법: 여러 테이블을 액세스하는 경우 자동처리