ER/Studio 데이터모델링이란 - 7.실전데이터모델링 이슈
2012.01.04 02:14
1. M : N 관계 해소 방법
1) 관계 엔티티로 분리
한 고객이 여러 번 방문한 방문일, 방문내용을 관리해야 한다.
고객 엔티티의 속성만으로 존재할 수 없고, 새로운 엔티티가 생성된다.
관계는 고객과 1 : M 관계로 설정되어야 한다.
2) 부모 엔티티에 속성 추가
3번 이상 방문시에는 테이블도 수정하고 프로그램도 수정해야 한다.
2. 1 : 1 관계 해소 방법
1 : 1로 대응되었다는 사실은 해당 엔티티의 PK가 동일한 경우를 의미한다.
1) 별개의 엔티티로 표현
두 엔티티의 생성 시기가 명확하게 구분
타 엔티티와의 관계가 서로 다른 경우
2) 하나의 엔티티로 통합
데이터를 선택할 때 항상 두 엔티티의 정보를 같이 가져와야 하고, 두 엔티티가 갖고 있는 다른 엔티티와의 관계가 비슷한 경우
3) 슈퍼엔티티 생성
3. 코드 엔티티 설계 방법
이와 같이 한 개의 속성만 가지는 코드의 엔티티는 다음과 같이 통합 엔티티로 설계한다.
각각의 코드에 별도의 제약이 있을 수 있는 것을 가정하여 코드규칙명1, 코드규칙1을 표현함으로써 전체 업무에서 효과적으로 사용할 수 있다.
부서코드나 사업소코드 등은 각각의 코드에 따라 여러 개의 속성이 존재하며 별도의 엔티티로 관리하도록 한다.
4. 도미노 속성에 대한 데이터 모델링 방법
앞의 값에 규칙적인 제약이 연쇄적으로 발생하는 경우를 도미노 속성이라 한다.
- 도미노 1 : DOM01 의 경우 CD001의 A, B가 올 수 있다.
- 도미노 2 : CD001 의 경우 A에 따라서는 CD013이 1001과 1002가, B에 따라서는 1001이 올 수 있다.
- 도미노 3 : CD013 의 경우 1001에 대해서는 CD201이 01과 02가 올 수 있으며, 1002에 대해서는 01 이 올 수 있다.
- 도미노 3 : CD201 의 01에 대해서는 CD723의 코드가 OA가 올 수 있으며, 02에 대해서는 CV, FS가 올 수 있다.
1) 해당 업무에서 도미노가 발생할 수 있는 최대값을 정의하여 모델링 하는 방법
위 모델은 도미노 제약이 최대 4레벨을 넘지 않은 경우에 적용
2) 도미노 속성을 BOM 을 이용하여 모델링하는 방법
도미노 구분과 순번을 제외한 순수한 도미노 속성간의 관계는 BOM과 같은 M:N의 자기 참조 관계를 가지고 있다.
도미노 속성의 BOM 모델은 도미노의 최대값 정의가 불확실하고 여러 개의 도미노 속성을 묶어 하나의 값처럼 사용하지 않고, 항상 상위 코드를 이용하여 하위 코드를 찾는 것처럼 연쇄적으로 이용할 때 사용하는 것이 좋다.
5. 이력 엔티티 설계 방법
하나의 업무 단위가 시간이 흐름에 따라 발생하는 과거와 현재 데이터를 지속적으로 유지하는 관리 방법을 이력 관리라 하고, 이력 관리를 위해 데이터 모델에 반영하여 표현한 뎅티티를 이력 엔티티라 한다.
1) 이력이 발생하는 유형
변경 이력 : 변경 이전과 이후의 데이터를 모두 관리
발생 이력 : 년, 월, 일 등 시간 순으로 발생
진행 이력 : 업무 진행 상태에 따라 업무의 상태 정보를 관리
2) 이력 엔티티 설계시 고려 사항
■ 진행이력의 경우 종료일자에 대한 고려
공사가 진행된 상태가 반드시 한 번씩 존재하고 데이터를 조회할 때 진행 상태 코드를 많이 이용하는 경우 위와 같이 모델링한다.
만약 진행상태 시작일자에 대해서 유일하고, 조회도 시작일자 기준으로 조회한다면 시작일자를 PK로 처리한다.
이 때 종료일자를 가져가는 것이 쿼리 성능을 보장할 수 있다.
종료일자가 없는 상태에서 2002년 7월 15일자에 해당하는 공사 진행 상태를 조회하려면, 인라인뷰가 포힘되어 있고 풀 테이블 스캔이나 인덱스 스캔의 범위가 넓어져 성능 또한 저하된다.
SELECT A.진행상태시작일자, A.공사번호, A.진행상태코드 FROM 공사진행 A, (SELECT MAX(진행상태시작일자) 진행상태시작일자 FROM 공사진행 WHERE 진행상태시작일자 <= '20020715') B WHERE A.진행상태시작일자 = B.진행상테시작일자
종료일자를 포함한다면,
SELECT A.진행상태시작일자, A.공사번호, A.진행상태모드 FROM 공사진행 A WHERE A.진행상태시작일자 <= '20020715' AND A.진행상태종료일자 > '20020715'
또한 새로운 데이터 입력시 진행상태종료일자에는 업무적으로 입력되는 데이터가 있을 수 없지만, 최대값(999년 1월1일)을 입력하여 인덱스를 이용하는데 문제가 없도록 한다.
■ 변경이력, 발생이력의 겨우 최신여부 속성에 대한 고려
변경이력, 발생이력의 경우에도 데이터 량이 많기 때문에 성능을 위해 최신여부 속성이 필요한 경우가 많다.
단 새로운 데이터 입력시 이전 변경일자에 대한 최신여부 값을 ‘Y’에서 ‘N’으로 바꾸어야 하는 부가 작업이 발생한다.
6. 효율적인 채번 방법
대리식별자인 일련번호 체계를 사용하는 데이터 모델에서는 채번(PK값을 증가하는 형식으로 생성하는 것)을 해야하는데, 다음과 같은 세 가지 방법이 있다.
방법 | 처리방법 | 장점 | 단점 |
---|---|---|---|
채번 테이블 | 채번 테이블 이용 | -DUP에러 없음 -일련번호 체계 가능 |
-LOCK 유발 -성능 저하 -관리 항목 증가 |
테이블에 최대값 적용 | INSERT INTO 테이블(번호, COL2, ...) SELECT DECODE(MAX(전호), MULL, 1, MAX(번호)+1) 일련번호 FROM 트랜잭션 WHERE ROWNUM = 1; |
-관리 항목 증가 없음 -빠른 성능 -일련번호 체계 가능 |
-이론적 DUP 에러 가능 |
시퀀스 오브젝트 이용 | Create sequence 테이블_seq increament by 1 start with 1 maxvalue 10000000000 cache 30; |
-빠른 성능 -DUP 에러 없음 -LOCK 없음 |
-관리 항목 증가 -일련번호 체계 불가능 |
7. 아크관계
어떤 엔티티가 두 개 이상의 다른 엔티티의 합집합과 관계를 가지는 것을 배타적(Exclusive) 혹은 아크(Arc) 관계라고 한다.
(1) 외부키 분리
각각의 컬럼을 별도로 분리하는 방법으로, 각각의 외부키는 별도의 컬럼으로 지정되며, 어느 한 컬럼에 값이 입력될 때, 다른 외부키는 항상 NULL값을 가진다.
이 방법은 대개의 경우, 인덱스의 수를 증가시키게 되며, 조인을 할때도 불리하다.
각각의 사항에 독립적으로 엑세스가 수행되는 경우에 사용하는 것이 좋으며, 특별한 경우가 아니라면 사용하지 않는 것이 바람직하다.
외부키를 하나로 통합하는 것
외부키를 하나로 통합했을 때, 각 외부키를 구분하기 위해 별도의 구분컬럼을 같이 지정하게 된다.
(2) 외부키 통합
외부키를 하나로 통합하는 것
외부키를 하나로 통합했을 때, 각 외부키를 구분하기 위해 별도의 구분컬럼을 같이 지정하게 된다.