'관계형 데이터 모델링 노트' 독서록 (1/2)

wonsik·2022년 10월 9일
1

독서록

목록 보기
1/2
post-thumbnail

엔터티 이야기

엔터티에 대한 설

  • 엔터티: 실체, 객체라는 의미로 실무적으로는 인터티라고 부른다.

  • 업무에 필요하고 정보를 저장하고 관리하기 위한 집합적인 것.

  • 엔터티는 사람, 장소, 물건, 사건, 개념등의 명사에 해당한다.

  • 엔터티는 업무상 관리가 필요한 관심사에 해당한다.

  • 엔터티를 정의할 때 가장 먼저 따져보는 것: 보이는 물체이냐 아니냐.

  • 그다음으로 분석: 스스로 존재할 수 있느냐

어떤 엔터티인지 심도있게 고민

  • 실체 엔터티, 행위 엔터티, 가공 엔터티, 기준 엔터티

설계하고자 하는 엔터티가 실체 엔터티인지 내역 엔터티인지 잘 생각

계약(원인)을 해서 계좌(결과)가 생긴다. -> 하나만 만든다면 계좌(결과) 엔터티로 설계한다

고객 엔터티에 포인트 사용 총합 속성이 있다고 집계엔터티는 아니다.
반대로 포인트 총합 관리하는 집계 엔터티에 고객명 속성이 있다고 실체 엔터티는 아니다.

엔터티 설계 원칙

  • 데이터 정체성: 정의 잘하자

  • 엔터티 무결성: 주 식별자 존재하자

  • 엔터티 유일성: 같은 성격 데이터는 유일

  • 데이터 혼용 배제: 하나의 엔터티에 서로 다른 성격 데이터 혼용x

  • 타 엔터티와 관계 존재: 다른 엔터티랑 관계 있어야함, 가공/기준 엔터티는 관계없을 수도 있음

  • 프로세스 도출 지양: 프로세스별로 엔터티 만들면 안됨

  • 화면 도출 지양: 화면별로 엔터티 만들면 안됨

  • 데이터 관리 요건: 사용안하면 삭제하기

    엔터티 이름짓기

    데이터 성격 파악하기 쉽게, 일관성 있게, 구체적으로
    고객 탈퇴인지 탈퇴 고객인지 잘 생각

    필요한 단어로만
    프로세스 표현x
    명사형으로
    짧게

    테이블명이 엔터티명에 종속되면 안됨 - 테이블명은 엔터티의 영문이름, 따라서 테이블 명에 단순 번호 등을 사용

    엔터티 설명

    엔터티 설명 잘쓰기

  • 엔터티 검증
    => 매우 중요

    모델에 표현되지 않은 업무가 있는가?
    모델에 표현된 불필요한 업무가 있는가?

    화면은 있는데 엔터티가 없는 경우
    엔터티만 존재하고 화면이 없는 경우
    엔터티에도 없고 화면에도 없는 경우

    하나의 엔터티는 하나의 주제로 구성되어야한다.
    유사한 성격의 데이터는 개별적인 엔터티에서 관리하고 있으면 안된다.
    필요한 단어만 사용해야한다.
    엔터티 설명이 존재하며 간결하고 명확해야 한다.
    업무 식별자가 존재해야한다.
    이력데이턴지 확인한다.

데이터 모델 설계 원칙

모델링 하면서 중요하게 생각해야할 사항
1. 데이터 무결성
2. 데이터 성능
3. 관리 효율성
4. 사용 편의성

무결성

데이터에 결점이 없는 상태, 엔터티에 주 식별자가 없다면 무결성을 지키기 어렵다.
참조 무결성이 없어도 무결성을 지키기 어렵다. 속성은 도메인에 맞는 데이터 타입을 사용(사람이름에 '123'오면 안됨)
중복 데이터 배제

  • 엔터티 무결성: 식별자와 관련된 제약. 앤터티에 존재하는 모든 인스턴스는 고유해야 하며, 널 값을 가지면 안된다., 한 엔터티에는 동일한 주 식별자 값이 존재할 수 없으며, 널 값은 허용하지 않는다.
  • 참조 무결성: 관계와 관련된 제약. 외래 식별자 속성 값은 참조되는 엔터티의 주 식별자 값과 일치하거나 널 값이어야 한다.
  • 도메인 무결성: 속성과 관련된 제약. 타입, 길이, 널 유무, 같은 기본 값 등의 범주가 존재
  • 업무 무결성: 기업에서 업무를 수행하는 방법이나 데이터를 처리하는 규칙(주문 금액이 3만 원 이상이면 배송비가 무료이다)

성능

조회성능, 쓰기성능으로 나뉨
주로 조회성능을 뜻함

조회성능은 소수 데이터 조회, 다량 데이터 조회로 나뉨

대량 데이터 조회 요건은 OLTP시스템에서는 자주 발생하지 않는다. OLTP에서 수십만 건의 대량 데이터를 한 번에 조회한다는 것 자ㅔ가 무리한 요건이다. 이때는 별도의 해결책을 찾는 것이 우선이다.

소량의 데이터에 대한 조회 성능은 주로 인덱스로 해결하며, 대량의 데이터에 대한 조회 성능은 스캔 방법과 조인 방법을 사용해서 해결. 또 다른 유용한 방법은 비정규형을 채택하는 것.

정규화 이야기

정규화에 대한 서설

속성의 종속성을 파악해서 엔터티를 설계하는 훈련. 즉 속성이 엔터티에 속하는 게 옳은지를 판단.
핵심 key: 식별자(Identifier), 종속성(Dependency)

엔터티를 대표하는 속성(업무 식별자)을 찾은 후에, 그 속성을 기준으로 대상 속성이 종속됐는지 여부를 판단.
업무 요건에 필요한 속성을 묶어서 엔터티를 설계하는 것이 정규화이다. 따라서 정규화를 하려면 업무 요건을 알아야 한다.

정규화 수행 시 사례 데이터를 활용하는 것이 좋다. (TDD느낌으로 생각이 든다.) - 릴레이션에 사례 데이터를 생성시켜 정규형을 위반하는지 검토

모든 속성은 주인이 되는 하나의 엔터티에만 속하고, 주 식별자만이 다른 엔터티에 존재할 수 있다. -> 다른 엔터티에 있는 속성이 필요하면, 외래 식별자를 통해 조인해서 얻는다.

더는 분해될 수 없는 엔터티가 정규형 엔터티이다. 관계형 데이터 모델이 되려면 속성의 종속성과 의존성을 분석해 더는 분해될 수 없는 엔터티로 만드는 정규화 과정을 반드시 거쳐야 한다.

정규화 장점

  1. 완전성(Completeness)
  2. 확장성(Flexibility)

완전성

정규화의 가장 큰 목적 중 하나는 중복 데이터를 제거하는 것이다.

확장성

함수 종속을 기반으로 속성을 결정자와 종속자로 구분해 모델 구조를 정의하기 때문에 데이터의 성격에 맞는 엔터티가 설계된다.

데이터의 정체성이 그대로 반영된 모델 구조에서는 업무가 수정되거나 추가돼도 엔터티에 반영하기 수월해진다.

아노말리

데이터 모델을 설계 시 가장 중요한 것은 무결성이다. 간혹 성능이 우선시 될 때가 있지만, 보통은 무결성이 우선.
아노말리는 데이터의 이상 현상이다. 데이터가 서로 맞지 않는 아노말리는 중복 데이터 때문에 발생한다. 중복 데이터가 존재하면 의도하지 않은 이상 현상이 발생할 수 있음.

  • 업데이트 아노말리: 릴레이션에서 속성의 값을 업데이트할 때 발생하는 데이터 이상 현상
  • 삭제 아노말리: 릴레이션에서 인스턴스를 삭제할 때 발생하는 데이터 이상 현상
  • 삽입 아노말리: 릴레이션에 새로운 인스턴스를 삽입할 때 발생하는 데이터 이상

비정규형

  • 업무 요건의 변경에 매우 취약하다. 즉 모델의 확장성이 좋지 않다.
  • 인덱스 수가 증가하고, 속성을 종으로 보여주는 화면에 대한 쿼리가 복잡해진다.
  • 반복 속성이 추가될 가능성이 없을 때 사용할 수 있다.
  • 전체 속성 레벨로 관리되므로 해당 데이터의 자식 엔터티를 가질 수 없다.

1정규형

  • 업무 요건의 변경에 유연하다. 즉 확장성이 좋은 모델이다.
  • 인덱스 수가 감소하고, 속성을 횡으로 보여주는 화면에 대한 쿼리가 비교적 복잡해진다.
  • 반복 속성이 추가될 가능성이 존재할 때 사용한다.
  • 인스턴스 레벨로 관리되므로 데이터의 자식 엔터티를 가질 수 있다.

비정규형의 가장 커다란 특징은 조회 성능이 좋아질 수 있다는 점이다. 하지만 때에 따라서는 결과적으로 성능에 악영향을 끼칠 수도 있다.

비정규형의 가장 커다란 단점은 업무 요건이 변경되면 대처하기 쉽지 않다는 점이다.

또한 비정규형은 널 데이터가 많이 발생할 수 있다. 널 데이터는 데이터 품질을 저하시킬 수 있기 때문에 주의해야 한다. 그밖에 비정규형은 인덱스가 많이 필요하며, 'OR'조회가 발생할 수 있는 등의 단점이 존재한다.

2정규형

  • 2정규화는 3정규화와 함께 가장 알기 쉬운 정규화다.
  • 2정규화는 주 식별자가 두 개 이상인 릴레이션에서 생긴다.
  • 릴레이션의 모든 속성이 후보 식별자 전체에 종속적이면 2정규형이다. 만약 일반 속성 중에 후보 식별자 전체에 종속되지 않고 일부에 종속된 속성이 있다면 2정규형이 아니다.

3정규형

  • 식별자가 아닌 일반 속성 간에는 종속성이 존재하면 안 된다.

BC정규형

  • 3정규형을 보강한 정규형이다.
  • 모든 결정자는 주 식별자여야 한다. + 릴레이션에 존재하는 종속자는 후보 식별자가 아니어야 한다.

정규화 요약

  • 릴레이션에 제거 대상이 존재하면 정규화를 해야 한다. 제거해야 하는 이유를 알고 어떻게 제거하는지를 알면 정규화는 수월하게 할 수 있다. 더 이상 제거할 것이 없는 모델이 가장 이상적이 모델이다.

  • 릴레이션에 다가 속성, 복합 속성, 반복 속성, 중첩 릴레이션 같은 제거 대상이 존재하면 1정규화를 수행해야 한다. 1정규화 순서는 다음과 같다.

  1. 제거해야 하는 속성을 엔터티에서 제거한다.
  2. 제거한 속성이 포함된 새로운 엔터티를 만든다.
  3. 기존 엔터티에서 새로운 엔터티로 관계를 상속한다.
  • 릴레이션에 존재하는 부분 종속을 제거하는 것이 2정규화다. 2정규화를 하는 순서는 다음과 같다.
  1. 제거해야 하는 속성을 엔터티에서 제거한다.
  2. 제거한 속성이 포함된 새로운 엔터티를 만든다.
  3. 새로 만든 엔터티에서 기존 엔터티로 관계를 상속한다.

1정규화와 유사하지만 관계의 방향이 다르다.

정규형과 성능

비정규형이 정규형보다 성능이 좋아진다는 보장은 없다. 쓰기 성능은 일반적으로 정규형의 성능이 좋으며, 조회 성능은 요건에 따라서 비정규형의 성능이 더 나빠질 수 있으므로 무조건 비정규형을 채택하면 잃는 것이 더욱 많아질 것이다.

데이터베이스가 오직 조회를 하기 위해서만 사용되는 것은 아니다. 데이터베이스를 사용하는 가장 근본적인 이유는 데이터를 효과적으로 관리하기 위해서다. 반드시 정규형을 채택해야 하며 성능 차원에서 문제가 되는 중요한 요건이 있을 때만 비 정규형을 고려해야 한다. 굳이 정합성을 저하하면서까지 성능을 고려할 이유가 있는지 숙고해야 한다. 사소한 성능 향상을 위해 데이터 무결성을 저해하는 것은 소탐대실일 것이다.

데이터 통합과 서브타입 이야기

일반화와 상세화

모델링에서 일반화한다는 것은 데이터 통합을 의미한다. 유사한 것을 묶는 것을 일반화라고 한다.

일반화의 상대 개념은 상세화다. 특수화라고도 한다.

데이터를 일반화 하거나 상세화하면 슈퍼타입과 서브타입이 생긴다.

데이터 통합

성능

일반적으로 많이 언급되는 것은 성능이다. 데이터를 통합하면 데이터는 많아질 수밖에 없다.

인서트가 많이 발생하는 엔터티에 다른 어떤 엔터티를 통합하는 것은 바람직하지 않다.

정체적 희석

지나치게 일반화하면 데이터의 정체성이 희석된다.

엔터티는 다양한 기준에 의해 분류가능한데 필자는 주로 실체/행위/기준/가공 엔터티로 나눈다.

다른 분류의 엔터티 간에 통합이 발생하면 데이터의 정체성이 희석된다.

무결성 저하

  • 외국인 한국인을 섞으면 주민등록번호에 NOT NULL 사용 불가.
  • 사람과 기업명을 같은 고객명 속성으로 두면 혼란이 생김.
  • 하지만 특정 속성이 하나로 줄어든다는 측면에서는 일종의 중복 속성이 없어지는 것이므로 무결성이 좋아진다고 볼 수 있다.

마이그레이션 가능 여부

데이터 통합을 고려하는 경우

  1. 데이터의 성격이 유사할 때
  2. 엔터티의 기초 속성이 유사할 때
  3. 데이터가 조회 등에 같이 사용될 때
  4. 역할을 관리할 때
  5. 대칭적인 업무일 때
  6. 계층 관계가 존재할 때
  7. 공통 속성이 존재할 때
  8. 배타 관계가 발생할 때
  9. 집계 엔터티의 집계 대상이 같을 때
  10. 비정규화를 수행할 때
  11. 일대일 관계일 때
  12. 유사한 종류의 데이터를 하나의 기준으로 만들 때
  13. 업무가 변경될 가능성이 많을 때

통합하는 기준을 간략하게 정리한 아래 조건 중에서 하나라도 만족하면 우선 통합을 고민해 보는 것이 좋다.

  • 데이터의 본질(성격)이 유사하다.
  • 식별자가 동일하면서 유사한 속성이 존재한다.
  • 식별자는 다르지만, 기초 속성이 유사하다.

데이터 주제 영역

주제 영역은 데이터 아키텍처의 최상위 단계로, 비즈니스의 목표를 달성하는 데 필요한 데이터 그룹을 의미한다.
여기저기에 산재된 유사한 성격의 데이터를 체계화해 그룹으로 묶은 것을 의미한다.
데이터를 유사한 성격으로 묶어 놓은 것이 주제 영역이다. 고객이나 상품, 조직 등이 데이터 성격으로 분류하고 정의한 주제 영역이다.

통합과 합체

데이터(인스턴스)를 통합하는 것과 데이터(속성)를 합치는 것. 전자는 통합이며 후자는 합체이다.

다른 종류의 테이블을 하나로 묶는 것(슈퍼-서브 타입 존재)을 통합이라 하고, 1:1관계의 테이블을 하나로 묶는 것을 합체라고 한다.

서브타입

서브타입이란 서브타입 엔터티를 말한다. 서브타입은 그 자체가 엔터티다. 슈퍼타입도 마찬가지로 슈퍼타입 엔터티다. 서브타입이 일반 엔터티와 다른 점은 슈퍼타입과 쌍을 이룬다는 점이다.

엔터티를 일반화하거나 상세화하면 슈퍼타입과 서브타입이 생긴다.

유사한 엔터티에서 공통 속성은 슈퍼타입 엔터티에 속하고, 고유 속성은 서브타입 엔터티에 속한다.

슈퍼타입과 서브타입 관계는 체계를 의미하는 상하 관계가 아니라 포함 관계다. 즉 상하위 개념의 부모-자식 관계가 아니라 동등항 관계다. 슈퍼타입과 서브타입을 하나의 인스턴스로 인식해야 한다.

서브타입 도출

서브타입을 도출하는 방법은 크게 두 가지다. 두 개 이상의 유사한 엔터티에서 공통 속성을 도출하는 방법과 복잡한 하나의 엔터티에서 유사한 속성끼리 분류하는 방법이 있다. 전자는 엔터티를 통합하는 행위고, 후자는 엔터티를 상세화 또는 논리화하는 행위다.

Is-A 서브타입과 Part-Of 서브타입

서브타입 각각이 한 개의 인스턴스로 존재하면 Is-A

서브타입을 합한게 한 개의 인스턴스가 되면 Part-Of

엄밀히 말하면 Part-Of는 서브타입 사용법이 아니다.

배타 서브타입과 중복 서브타입

배타 서브타입: 서브타입 부분집합 간에 중복이 발생하지 않는 서브타입, 각 서브타입의 인스턴스 합은 슈퍼타입의 인스턴스 개수와 같다.

중복 서브타입: 서브타입 부분집합 간에 중복이 발생하는 서브타입

중복 서브타입 중에 슈퍼타입과 서브타입이 1:다 인경우에는 1:1이 되도록 서브타입의 개수를 늘려준다.

완전 서브타입과 불완전 서브타입

완전 서브타입: 슈퍼타입의 모든 인스턴스가 최소한 하나의 서브타입 인스턴스와 관계가 존재하는 서브타입

불완전 서브타입: 슈퍼타입에만 인스턴스가 존재하고 서브타입에는 인스턴스가 존재하지 않는 서브타입, 즉 고유 속성이 존재하지 않는 서브타입

profile
새로운 기술을 배우는 것을 좋아하는 엔지니어입니다!

0개의 댓글