데이터베이스 설계
엔터티
서브타입
- 서브타입 생성 유형
- 엔터티에서 인스턴스를 분류하여 서브타입을 생성하는 경우
- 성질이 서로 다르거나 유사한 엔터티를 통합하여 서브타입을 생성하는 경우
엔터티의 종류
- 핵심 엔터티
- 업무 행위에 대한 육하원칙 요소, ‘업무 수행 개체’가 추상화되어 모형화된 것
- 행위주체, 행위시간, 행위 장소, 행위 대상이나 목적물, 행위 방법, 행위 근거나 동기
- 가장 중요하므로 먼저 도출하고 확정
- 업무 행위에 대한 육하원칙 요소, ‘업무 수행 개체’가 추상화되어 모형화된 것
- 행위 엔터티
- 관리 대상 업무 행위를 추상화하여 표현한 엔터티
- 항상 부모 엔터티를 가짐
부수 엔터티
- 개체 엔터티나 행위 엔터티에 종속되어 보조적이고 부수적인 정보를 표현
- ~상세, ~내역, ~정보 등의 명사 형태로 주로 표현
- 관계 엔터티나 코드 엔터티도 부수 엔터티에 해당
- 대부분의 부수 엔터티는 자식 역할 vs. 코드 엔터티는 부모 역할
논리적 성격의 엔터티 모델링하기
- 업무 행위를 의미하는 행위 엔터티 구성 (보험계약)
- 행위 주체를 의미하는 물리적 성격의 엔터티 구성 (고객)
- 행위 엔터티와 물리적 엔터티 사이에 탄생되는 자식 엔터티를 논리적 성격의 엔터티로 구성 (계약자)
속성과 식별자
도메인
: 속성 값으로 올 수 있는 값들의 집합
- 도메인명: 단일어로서 소속된 속성들의 공통적인 성격을 의미할 수 있는 명칭
- 도메인 유형: 범위형, 형식형, 열거형 도메인
- 범위형 도메인: 데이터의 길이가 제한되는 도메인 (주문수량, 청구금액 등)
- 형식형 도메인: 속성값이 특정 포맷을 가지는 도메인 (주민등록번호)
- 열거형 도메인: 속성값이 열거된 값들로 제한되는 도메인 (성별)
- 도메인 구성 및 사용 방법
- 모든 엔터티에서 사용되는 각 속성의 데이터 형식을 조사하여 도메인 유형 결정 및 데이터 길이 조사
- 도메인 유형&데이터 길이 순으로 오름차순 정렬
- 각 속성의 의미를 파악하여 도메인별 그룹핑하고 도메인 유형과 데이터 형식을 결정, 적합한 도메인명 부여
- 동일한 방법으로 모든 속성들에 대해 도메인 결정 후 도메인별 데이터 규칙 결정
- 결정된 내용을 기반으로 도메인 사전 구성
속성의 종류
- 고유 속성: 엔터티 자신을 표현하는 속성. 주로 명칭, 내용, 특성 등
- 추출 속성: 자신이나 다른 엔터티로부터 가공된 속성 (e.g. 집계 속성)
- 관계 속성: 부모에게 상속받은 속성(e.g.주문고객번호: 고객번호에서 상속)
식별자
- 본질 식별자: 인스턴스의 탄생 근거를 명확히 하기 위해 사용
- 탄생번호의 의미를 가진 인위적인 속성을 추가하여 사용하기도 함
- 서브타입의 본질 식별자는 슈퍼타입 측면에서 구성 (‘정규직 사원’의 속성은 ‘사원’에서)
- 실질 식별자의 구성 방법
- 본질 식별자 속성들로 구성
- 인위적인 속성을 추가하여 구성(인조 식별자)
- 본질 식별자 속성들과 인위적인 속성을 조합하여 구성
- 대체 식별자를 사용하는 경우
- 실질식별자 대신 자식에게 상속하여 대체 역할 (비정규화 방지)
- 서브타입 인스턴스 식별 (고객 중 ‘개인고객’의 주민등록번호를 고객번호 대신 사용)
- 속성 값의 중복 방지(고객번호 대신 id 사용)
관계 및 정규화
관계
- 식별 상속과 비식별 상속
- 식별 상속: 자식 엔터티가 상속받은 식별자 속성을 자신의 실질 식별자 일부로 사용 (자신의 관계선에 UID bar 그려서 표기): 주문-주문상세, 자식은 필수 관계
- 비식별 상속: 상속받을 식별자 속성을 일반 속성으로 사용: 부서-사원
직접 상속과 간접 상속
- 직접 상속: 상대 엔터티의 식별자 속성들의 정보가 있는 경우
- 간접 상속: 식별자 속성들의 정보는 없지만 간접적인 경로를 통하여 상속
다양한 관계
- 순환 관계: 어떤 엔터티가 자신을 부모로 하여 관계를 맺고 있는 것(e.g.계층 관계)
- BOM(Bill Of Material) 관계: 하위부품-상위부품-제품 관계(M:N 순환 관계)
배타적 관계[고객 내 개인-법인으로부터 상속받는 ‘계좌’]의 성질과 특징들
- 자식 엔터티(계좌)는 반드시 하나
- 각 부모로부터 상속받는 속성의 수는 모두 동일 (식별자만? 아니어도?)
- 각 부모로부터 상속받는 속성들의 데이터 형식이 호환성이 있어야 함
- 자식 엔터티는 부모 엔터티들로부터 상속받는 상속 유형이 모두 동일하도록 상속
- 배타적 관계에 속해 있는 임의의 관계는 다른 관계에 속할 수 없음
- 자식 엔터티의 참여도와 부모 엔터티의 참여도는 달라도 됨: 가능하면 동일하게!
- 배타적 관계는 서브타입과 혼돈하지 말 것(배타적 관계는 부모-자식!)
- 하나의 엔터티는 여러 개의 배타적 관계를 가질 수 있음
- 일반적으로 상속-구분 속성을 사용
- 배타적 관계의 아크는 자식 엔터티를 기준으로 그림
다중 관계: ‘고객’과 ‘보험계약’의 두 엔터티 사이에서 ‘계약자’ ‘주피보험자’ ‘종피보험자’ 등의 많은 관계가 존재하는 경우
- 병렬 관계: 많은 관계가 병렬적 관계선으로 존재하는 경우
- 각 관계 속성에 각각 인덱스를 생성하여 인덱스가 증가할 확률이 높음
- 각 관계가 자식 엔터티를 가질 수 없음
- 업무가 변화되어 새로운 관계 추가시 테이블에 외래키 컬럼을 추가해야 함
- 관계마다 전용 관계가 지정되어 해당 관계 속성으로 변환되는 것은 장점
- 직렬 관계: 두 엔터티 사이의 관계를 모두 M:N의 하나의 관계로 표현
- 교차 엔터티(e.g. 계약관련자)를 사용하여 비용은 증가
- 교차 테이블의 행은 모두 관계에 관련되어 관리나 처리가 상당히 유리
- 새로운 관계 추가시 서브타입만 삭제하거나 갱신: 유연성 증가
- 관계가 자식 엔터티나 속성을 가질 수 있어 추가적인 처리가 가능
- 병렬 관계: 많은 관계가 병렬적 관계선으로 존재하는 경우
정규화
- 엔터티들의 모든 속성이 항상 111 규칙을 만족
- 자식 엔터티가 항상 부모의 식별자 속성을 상속
-> 실무 현장에서 사용하는 제3정규형까지 자동적으로 만족!
이상 현상
- 중복 데이터로 인해 데이터 변경 동작이 올바르게 동작하지 않는 현상
- 테이블이 제대로 정규화되지 않아서 발생
하나의 테이블에 성질이 다른 여러 인스턴스의 속성들이 혼재되어 있을 때 발생
삽입 이상: 불필요한 어떤 데이터를 입력하지 않으면 필요한 데이터도 삽입되지 않는 현상
삭제 이상: 삭제되어서는 안 되는 데이터까지 함께 삭제되는 현상
갱신 이상: 여러 테이블에 중복되어 저장된 데이터를 갱신할 때 일부는 갱신되지 않는 현상
함수적 종속성
- 어떤 속성이 기준 속성에 대해 종속되는 현상: 속성의 함수적 종속성
- 엔터티에서는 식별자가 결정자, 일반 속성이 종속자가 됨
정규형과 정규화
제1정규화
- 엔터티에 속한 각 속성이 한 시점에서 하나의 원자값을 가지는 형태(111)를 만족하는 경우
- 자식 엔터티를 생성하고 다중값 속성을 자식 엔터티로 이동시킴과 동시에 자신의 식별자를 상속
- 주문과 주문 상세 분리
제2정규화
- 엔터티에서 어떤 부분 종속도 발생하지 않는 형태
- 부분종속되는 부분만 별도 분리하여 부모 엔터티로 하고, 부모 엔터티로부터 식별자 상속
- 주문상세에서 제품 분리
제3정규화
- 엔터티에서 이행 종속을 가지지 않은 형태
- 이행 종속성 : ‘X->Y이고 Y->Z이면 X->Z 이다’ (X:사번(식별자), Y:근무부서번호, Z:부서명)
- 이행 종속되는 부분을 부모 엔터티로 별도 분리하여 식별자를 상속받고, 부모엔터티의 식별자는 그 부분의 결정자로 함
- 주문에서 거래처 분리
이력 관리
점 이력과 선분 이력
점 이력: 데이터가 발생하거나 변경된 시간만을 관리하는 방식
- 이력 데이터를 저장하고 이해하기는 용이하지만 과거 시점의 데이터를 재현하려면 비효율 발생
- 로그성 데이터와 같이 조회 요구가 없이 쌓아두기만 해도 좋은 경우 사용
- 함수나 서브 쿼리의 STOP KEY 기능을 사용하면 다소 성능 개선
선분 이력: 데이터가 변경되어 유지되는 기간(시작시점과 종료시점)을 관리하는 방식
- 이력 데이터를 저장하고 이해하기는 불리하지만 이력을 찾아 재현하고 활용할 때는 매우 효율적
- 특정 통화의 환율이 변경되면 기존 적용 환율의 인스턴스 종료시각을 변경하고 새 인스턴스 생성
- 종료시각은 ‘99991231’로 하여 지정한 기간동안 유지되도록 함
속성의 이력 관리
- ‘무엇을 관리해야 할 것인가’: 이력대상 속성과 시간 속성, 발생 원인이나 관련 정보
- 이력 엔터티의 실질 식별자의 선정: 새로운 실질 식별자 필요
- 이력 모델링 방법
- 이력 엔터티를 생성하고 관리대상 속성들을 이력 엔터티로 이동
- 이력 엔터티의 관리대상 시간 속성에 대한 관리 방법을 결정하고 추가
- 이력 엔터티에게 식별자 속성들을 상속
- 이력 에터티의 실질 식별자 속성들을 결정
- 참고를 위해 필요한 데이터가 있으면 속성으로 추가
물리 데이터 모델
데이터 무결성 제약조건
제약 조건
- 엔터티 무결성 제약조건(=키 제약조건)
- 도메인 무결성 제약조건: NOT NULL, DEAULT, CHECK 등
- 참조 무결성 제약조건: FK, CASCADE, NULL
- 사용자 정의 무결성 제약조건: 속성값 비교, 선분이력 중복검사 등을 위해 트리거로 처리
처리 방법
- 선언적 처리 방법: 테이블을 정의하면서 함께 제약 조건을 지정
- 애플리케이션 처리 방법: 애플리케이션에서 미리 처리
- 트리거링 처리 방법: 여러 테이블을 액세스하는 경우 자동처리