엔터티: 실체, 객체라는 의미로 실무적으로는 인터티라고 부른다.
업무에 필요하고 정보를 저장하고 관리하기 위한 집합적인 것.
엔터티는 사람, 장소, 물건, 사건, 개념등의 명사에 해당한다.
엔터티는 업무상 관리가 필요한 관심사에 해당한다.
엔터티를 정의할 때 가장 먼저 따져보는 것: 보이는 물체이냐 아니냐.
그다음으로 분석: 스스로 존재할 수 있느냐
설계하고자 하는 엔터티가 실체 엔터티인지 내역 엔터티인지 잘 생각
계약(원인)을 해서 계좌(결과)가 생긴다. -> 하나만 만든다면 계좌(결과) 엔터티로 설계한다
고객 엔터티에 포인트 사용 총합 속성이 있다고 집계엔터티는 아니다.
반대로 포인트 총합 관리하는 집계 엔터티에 고객명 속성이 있다고 실체 엔터티는 아니다.
데이터 정체성: 정의 잘하자
엔터티 무결성: 주 식별자 존재하자
엔터티 유일성: 같은 성격 데이터는 유일
데이터 혼용 배제: 하나의 엔터티에 서로 다른 성격 데이터 혼용x
타 엔터티와 관계 존재: 다른 엔터티랑 관계 있어야함, 가공/기준 엔터티는 관계없을 수도 있음
프로세스 도출 지양: 프로세스별로 엔터티 만들면 안됨
화면 도출 지양: 화면별로 엔터티 만들면 안됨
데이터 관리 요건: 사용안하면 삭제하기
데이터 성격 파악하기 쉽게, 일관성 있게, 구체적으로
고객 탈퇴인지 탈퇴 고객인지 잘 생각
필요한 단어로만
프로세스 표현x
명사형으로
짧게
테이블명이 엔터티명에 종속되면 안됨 - 테이블명은 엔터티의 영문이름, 따라서 테이블 명에 단순 번호 등을 사용
엔터티 설명 잘쓰기
엔터티 검증
=> 매우 중요
모델에 표현되지 않은 업무가 있는가?
모델에 표현된 불필요한 업무가 있는가?
화면은 있는데 엔터티가 없는 경우
엔터티만 존재하고 화면이 없는 경우
엔터티에도 없고 화면에도 없는 경우
하나의 엔터티는 하나의 주제로 구성되어야한다.
유사한 성격의 데이터는 개별적인 엔터티에서 관리하고 있으면 안된다.
필요한 단어만 사용해야한다.
엔터티 설명이 존재하며 간결하고 명확해야 한다.
업무 식별자가 존재해야한다.
이력데이턴지 확인한다.
모델링 하면서 중요하게 생각해야할 사항
1. 데이터 무결성
2. 데이터 성능
3. 관리 효율성
4. 사용 편의성
데이터에 결점이 없는 상태, 엔터티에 주 식별자가 없다면 무결성을 지키기 어렵다.
참조 무결성이 없어도 무결성을 지키기 어렵다. 속성은 도메인에 맞는 데이터 타입을 사용(사람이름에 '123'오면 안됨)
중복 데이터 배제
조회성능, 쓰기성능으로 나뉨
주로 조회성능을 뜻함
조회성능은 소수 데이터 조회, 다량 데이터 조회로 나뉨
대량 데이터 조회 요건은 OLTP시스템에서는 자주 발생하지 않는다. OLTP에서 수십만 건의 대량 데이터를 한 번에 조회한다는 것 자ㅔ가 무리한 요건이다. 이때는 별도의 해결책을 찾는 것이 우선이다.
소량의 데이터에 대한 조회 성능은 주로 인덱스로 해결하며, 대량의 데이터에 대한 조회 성능은 스캔 방법과 조인 방법을 사용해서 해결. 또 다른 유용한 방법은 비정규형을 채택하는 것.
속성의 종속성을 파악해서 엔터티를 설계하는 훈련. 즉 속성이 엔터티에 속하는 게 옳은지를 판단.
핵심 key: 식별자(Identifier), 종속성(Dependency)
엔터티를 대표하는 속성(업무 식별자)을 찾은 후에, 그 속성을 기준으로 대상 속성이 종속됐는지 여부를 판단.
업무 요건에 필요한 속성을 묶어서 엔터티를 설계하는 것이 정규화이다. 따라서 정규화를 하려면 업무 요건을 알아야 한다.
정규화 수행 시 사례 데이터를 활용하는 것이 좋다. (TDD느낌으로 생각이 든다.) - 릴레이션에 사례 데이터를 생성시켜 정규형을 위반하는지 검토
모든 속성은 주인이 되는 하나의 엔터티에만 속하고, 주 식별자만이 다른 엔터티에 존재할 수 있다. -> 다른 엔터티에 있는 속성이 필요하면, 외래 식별자를 통해 조인해서 얻는다.
더는 분해될 수 없는 엔터티가 정규형 엔터티이다. 관계형 데이터 모델이 되려면 속성의 종속성과 의존성을 분석해 더는 분해될 수 없는 엔터티로 만드는 정규화 과정을 반드시 거쳐야 한다.
정규화의 가장 큰 목적 중 하나는 중복 데이터를 제거하는 것이다.
함수 종속을 기반으로 속성을 결정자와 종속자로 구분해 모델 구조를 정의하기 때문에 데이터의 성격에 맞는 엔터티가 설계된다.
데이터의 정체성이 그대로 반영된 모델 구조에서는 업무가 수정되거나 추가돼도 엔터티에 반영하기 수월해진다.
데이터 모델을 설계 시 가장 중요한 것은 무결성이다. 간혹 성능이 우선시 될 때가 있지만, 보통은 무결성이 우선.
아노말리는 데이터의 이상 현상이다. 데이터가 서로 맞지 않는 아노말리는 중복 데이터 때문에 발생한다. 중복 데이터가 존재하면 의도하지 않은 이상 현상이 발생할 수 있음.
비정규형의 가장 커다란 특징은 조회 성능이 좋아질 수 있다는 점이다. 하지만 때에 따라서는 결과적으로 성능에 악영향을 끼칠 수도 있다.
비정규형의 가장 커다란 단점은 업무 요건이 변경되면 대처하기 쉽지 않다는 점이다.
또한 비정규형은 널 데이터가 많이 발생할 수 있다. 널 데이터는 데이터 품질을 저하시킬 수 있기 때문에 주의해야 한다. 그밖에 비정규형은 인덱스가 많이 필요하며, 'OR'조회가 발생할 수 있는 등의 단점이 존재한다.
릴레이션에 제거 대상이 존재하면 정규화를 해야 한다. 제거해야 하는 이유를 알고 어떻게 제거하는지를 알면 정규화는 수월하게 할 수 있다. 더 이상 제거할 것이 없는 모델이 가장 이상적이 모델이다.
릴레이션에 다가 속성, 복합 속성, 반복 속성, 중첩 릴레이션 같은 제거 대상이 존재하면 1정규화를 수행해야 한다. 1정규화 순서는 다음과 같다.
1정규화와 유사하지만 관계의 방향이 다르다.
비정규형이 정규형보다 성능이 좋아진다는 보장은 없다. 쓰기 성능은 일반적으로 정규형의 성능이 좋으며, 조회 성능은 요건에 따라서 비정규형의 성능이 더 나빠질 수 있으므로 무조건 비정규형을 채택하면 잃는 것이 더욱 많아질 것이다.
데이터베이스가 오직 조회를 하기 위해서만 사용되는 것은 아니다. 데이터베이스를 사용하는 가장 근본적인 이유는 데이터를 효과적으로 관리하기 위해서다. 반드시 정규형을 채택해야 하며 성능 차원에서 문제가 되는 중요한 요건이 있을 때만 비 정규형을 고려해야 한다. 굳이 정합성을 저하하면서까지 성능을 고려할 이유가 있는지 숙고해야 한다. 사소한 성능 향상을 위해 데이터 무결성을 저해하는 것은 소탐대실일 것이다.
모델링에서 일반화한다는 것은 데이터 통합을 의미한다. 유사한 것을 묶는 것을 일반화라고 한다.
일반화의 상대 개념은 상세화다. 특수화라고도 한다.
데이터를 일반화 하거나 상세화하면 슈퍼타입과 서브타입이 생긴다.
일반적으로 많이 언급되는 것은 성능이다. 데이터를 통합하면 데이터는 많아질 수밖에 없다.
인서트가 많이 발생하는 엔터티에 다른 어떤 엔터티를 통합하는 것은 바람직하지 않다.
지나치게 일반화하면 데이터의 정체성이 희석된다.
엔터티는 다양한 기준에 의해 분류가능한데 필자는 주로 실체/행위/기준/가공
엔터티로 나눈다.
다른 분류의 엔터티 간에 통합이 발생하면 데이터의 정체성이 희석된다.
통합하는 기준을 간략하게 정리한 아래 조건 중에서 하나라도 만족하면 우선 통합을 고민해 보는 것이 좋다.
주제 영역은 데이터 아키텍처의 최상위 단계로, 비즈니스의 목표를 달성하는 데 필요한 데이터 그룹을 의미한다.
여기저기에 산재된 유사한 성격의 데이터를 체계화해 그룹으로 묶은 것을 의미한다.
데이터를 유사한 성격으로 묶어 놓은 것이 주제 영역이다. 고객이나 상품, 조직 등이 데이터 성격으로 분류하고 정의한 주제 영역이다.
데이터(인스턴스)를 통합하는 것과 데이터(속성)를 합치는 것. 전자는 통합이며 후자는 합체이다.
다른 종류의 테이블을 하나로 묶는 것(슈퍼-서브 타입 존재)을 통합이라 하고, 1:1관계의 테이블을 하나로 묶는 것을 합체라고 한다.
서브타입이란 서브타입 엔터티를 말한다. 서브타입은 그 자체가 엔터티다. 슈퍼타입도 마찬가지로 슈퍼타입 엔터티다. 서브타입이 일반 엔터티와 다른 점은 슈퍼타입과 쌍을 이룬다는 점이다.
엔터티를 일반화하거나 상세화하면 슈퍼타입과 서브타입이 생긴다.
유사한 엔터티에서 공통 속성은 슈퍼타입 엔터티에 속하고, 고유 속성은 서브타입 엔터티에 속한다.
슈퍼타입과 서브타입 관계는 체계를 의미하는 상하 관계가 아니라 포함 관계다. 즉 상하위 개념의 부모-자식 관계가 아니라 동등항 관계다. 슈퍼타입과 서브타입을 하나의 인스턴스로 인식해야 한다.
서브타입을 도출하는 방법은 크게 두 가지다. 두 개 이상의 유사한 엔터티에서 공통 속성을 도출하는 방법과 복잡한 하나의 엔터티에서 유사한 속성끼리 분류하는 방법이 있다. 전자는 엔터티를 통합하는 행위고, 후자는 엔터티를 상세화 또는 논리화하는 행위다.
서브타입 각각이 한 개의 인스턴스로 존재하면 Is-A
서브타입을 합한게 한 개의 인스턴스가 되면 Part-Of
엄밀히 말하면 Part-Of는 서브타입 사용법이 아니다.
배타 서브타입: 서브타입 부분집합 간에 중복이 발생하지 않는 서브타입, 각 서브타입의 인스턴스 합은 슈퍼타입의 인스턴스 개수와 같다.
중복 서브타입: 서브타입 부분집합 간에 중복이 발생하는 서브타입
중복 서브타입 중에 슈퍼타입과 서브타입이 1:다 인경우에는 1:1이 되도록 서브타입의 개수를 늘려준다.
완전 서브타입: 슈퍼타입의 모든 인스턴스가 최소한 하나의 서브타입 인스턴스와 관계가 존재하는 서브타입
불완전 서브타입: 슈퍼타입에만 인스턴스가 존재하고 서브타입에는 인스턴스가 존재하지 않는 서브타입, 즉 고유 속성이 존재하지 않는 서브타입