01_ 관계형 테이블로 전환
& 논리적 데이터 모델링을 통해 산출한 ERD를 테이블 관계도로 전환
& 케이스툴(논리 모델 => 물리 모델)
& 변환 항목
◎ 엔티티타입은 테이블로 전환한다. (엔티티타입:테이블 => 1:1, N:1, 1:N)
◎ 주식별자는 PK로 변환하다.
◎ 속성은 컬럼으로 변환한다.
◎ 관계에 의한 외부 식별자는 FK로 변환한다.
[그림 7-2] 독립 엔티티타입은 독립 테이블로 |
독립 엔티티타입의 주식별자는 스스로 발생되었으며, 다른 엔티티타입 때문에 발생되지 않음, 따라서 위의 예에서 사원 엔티티타입의 주식별자인 사원번호는 테이블에서 PK가 된다.
[그림 7-3] 완전 종속 엔티티타입은 완전 종속 테이블로 |
완전 종속 엔티티타입의 주식별자는 자신의 부모 엔티티타입으로부터 상속받은 주식별자가 반드시 존재해야 한다, 위의 예에서 발령 엔티티타입의 주식별자는 사원번호+발령시작일자가 되며, 이와 같은 PK를 복합키(Composit Key)라고 한다.
[그림 7-4] 부분 종속 엔티티타입은 부분 종속 테이블로 |
부분 종속 엔티티타입의 주식별자는 스스로 생성되지만, 자신의 일반 속성은 부모 엔티티타입에서 상속받아 발생된다, 위의 예에서 부서 엔티티타입의 주식별자는 부서번호이며, 사원 엔티티타입의 주식별자는 사원번호이며 상속받은 부서번호는 주식별자를 구성하지 않는다.
& 엔티티타입의 주식별자는 테이블의 PK로 전환된다.
& PK는 각 로우(Row)를 유일하게(Unique) 할 뿐 아니라, 다른 테이블과의 관계에 의해 무결성 제약을 유지시키는 역할을 수행
주식별자는 업무적으로 의미있는 속성이거나, 인공적으로 생성한 속성이거나와 관계 없이 PK가 된다
[그림 7-5] PK는 무결성 제약을 유지시킨다 |
테이블의 PK는 다른 테이블과의 관게에서 무결성 제약 조건에 참여하는 역할을 수행한다, 위의 예에서 자신의(사원) 테이블에게 영향을 주는 상대(부서) 테이블의 PK(부서번호)가 포함 된다.
일반적으로 PK를 지정하여 각각의 로우(Row)를 유일하게 식별할 수 있도록 하지만, 테이블간 참조가 없다면 Unique Index만 지정 할 수 있다. PK 이외에도 대체키(Alternate Key)가 있을 수도 있으며, 이는 테이블에서 Unique Index 대상이 된다.
[그림 7-6] PK의 Null 처리 |
PK는 해당 테이블에 있는 각각의 로우를 대표하므로 Null 값을 갖지 않는다, 엔티티 통합한 경우 Null 대신 기본값을 지정 해서 사용한다, 오라클 에서는 Nullable 컬럼도 PK 를 생성하면 자동으로 Not Null 로 바뀐다, 위의 예에서 하나로 통합된 배송요청 엔티티타입의 경우 부서에서 배송 요청을 할경우 사원번호 컬럼에 Null 값이 발생하지 않도록 기본값을 지정해야 한다.
설사 PK 수정 업무가 있더라도, 실제로는 PK 삭제→생성 이다.
PK 가 없으면 FK 를 생성할 수 없다, 데이터의 참조 무결성을 보장하기 위해 가급적 모든 테이블에 PK를 생성한다.
& 관계는 1:1, 1:M, M:N 로 구분되며, 주식별자에 영향을 주는가의 여부에 따라 주식별자 관계(Identifying Relationship)와 비식별자 관계(Non-Identifying Relationship)가 있을 수 있다.
[그림 7-7] 1:1 주식별자 관계를 테이블로 |
위의 예는 청구가 존재해야 출급이 존재할 수 있다는 업무 규칙이 있는 경우이며 (관계도 실선), 청구.청구번호 가 출급 테이블의 PK (출급.출급번호)로 이용 되었다. FK 제약이 없을경우 데이터의 참조 무결성을 보장할 수 없다.
[그림 7-8] 1:1 비식별자 관계를 테이블로 |
위의 예는 청구가 반드시 존재할 필요가 없는 업무 규칙이 있는 경우이며 (관계도 점선), 청구.청구번호 가 출급 테이블의 일반 컬럼 (출급.청구번호)로 이용 되었다, 출급.청구번호가 Null 이 아니라면 반드시 청구 테이블에 존재하는지 확인해야 한다.
[그림 7-9] 1:M 주식별자 관계를 테이블로 |
1:1 주식별자 관계 처럼 자식 PK가 영향을 받으나, 자식 테이블의 PK 컬럼 개수가 반드시 더 많아야 한다. (주문.주문번호, 주문목록.{주문번호(FK),제품번호})
[그림 7-10] 자기 참조 관계를 테이블로 |
자신의 테이블에 자신의 PK 영역이, 일반 컬럼의 FK 영역으로 포함하는 모습으로 나타난다.
& 실전 프로젝트에서는 슈퍼타입 서브타입 모델링을 많이 활용함, 모델 결정은 슈퍼타입과 서브타입의 데이터 특징(트랜잭션의 성격과 양)에 따라 결정 해야 함.
[그림 7-11] 슈퍼타입/서브타입 관계를 테이블로 |
논리 모델링에서 자주 이용되는 모델링 방법
① 각각의 테이블로 변환
[그림 7-12] 슈퍼타입/서브타입 관계-개별 테이블로 변환 |
[그림 7-13] 슈퍼타입/서브타입 관계-개별 테이블로 변환 |
슈퍼타입 테이블과 서브타입 테이블간에 모두 1:1 주식별자 관계에 의해 접수번호가 생성 되었으며, 접수.접수종류코드 를 통해서 접수 테이블의 각각의 레코드가 어느 서브타입 테이블과 연관되는지 구분한다.
속도↑, 슈퍼타입정보조회SQL작성↑, 저장공간↓, 참조무결성규칙적용↑, 슈퍼타입+서브타입정보조회SQL작성/성능↓
② 서브타입 테이블로 변환
[그림 7-14] 슈퍼타입/서브타입 관계-각 서브타입 테이블로 변환 |
[그림 7-15] 슈퍼타입/서브타입 관계-각 서브타입 테이블로 변환(1:1 관계) |
서브타입별 구분자불필요, 부모 테이블과 조인 불필요, 풀 스캔 유리, 참조무결성규칙적용 가능, 서브타입 동시 활용 SQL 작성 어려움/성능저하, 서브타입별로 구분하여 처리하는 업무가 많을 경우 권장
③ 통합 테이블로 변환
[그림 7-16] 슈퍼타입/서브타입 관계-통합 테이블로 변환 |
[그림 7-17] 슈퍼타입/서브타입 관계-통합 테이블로 변환 |
서브타입의 모든 컬럼을 슈퍼타입에 하나로 통합하여 테이블로 구성, 서브타입별 구분자필요, 데이터 조회/SQL 구성 편리, 조인 없음, 서브타입별로 구분하지 않고 처리하는 업무가 많을 경우 권장, 서브타입별 컬럼 형식이 상이함으로 인해 제약조건 설정 어려움(Not Null)