이번에는 주어진 mini-world를 ERD로 만들어 보겠습니다.
회사는 여러 부서들로 구성된다.
각 부서마다 고유한 이름, 고유한 번호, 부서를 관리하는 특정 사원이 있다.
사원이 부서를 관리하기 시작한 날짜도 유지한다.
한 부서는 여러 위치에 있을 수 있다.
한 부서는 여러 프로젝트들을 관리한다.
각 프로젝트는 고유한 이름, 고유한 번호, 한 개의 위치를 가진다.
각 사원에 대해서 이름, 사회보장번호, 주소, 급여, 성별, 생년월일을 저장한다.
한 사원은 한 부서에 속하지만, 여러 프로젝트들에 관여할 수 있다.
한 사원이 관여하는 프로젝트들은 그 사원이 소속된 부서가 관리하는 프로젝트가 아니어도 무방하다.
반드시 한 부서의 각 사원이 각 프로젝트를 위해 일하는 주당 근무 시간을 기록한다.
또한 각 사원의 직속 상사도 유지한다.
보험 목적을 위해서 각 사원의 부양가족들을 기록한다.
각 부양 가족에 대해서 이름, 성별, 생년월일, 사원과의 관계를 기록한다.
이 방대한 정보를 어떻게 ERD로 만들 수 있을까요?
한 문장씩 ERD로 만들어 보도록 하겠습니다.
회사를 전체 database로 놓고, 먼저 부서를 엔티티로 설정합니다.
엔티티 부서에는 이름, 번호라는 애트리뷰트가 존재하며, 고유한 값을 가지므로 키 애트리뷰트(밑줄)로 설정합니다.
그리고 부서를 관리하는 특정 사원이 있으므로 관계를 맺어주는데,
한 부서의 부서장은 보통 한명이므로 1:1 관계를 맺어줍니다.
또한 부서장이 없는 부서가 존재하지 않는다면 부서 쪽에 이중실선을 그려줍니다.
이중 실선에 대해서는 아래에서 더 알아보도록 하겠습니다.
마지막으로 "사원이 부서를 관리하기 시작한 날짜"도 ERD에 넣어주어야 하는데, 이는 "관리"의 속성입니다.
따라서 애트리튜브를 갖는 관계인 "관리"는 테이블로 만들 수 있겠죠?
한 부서는 여러 위치에 있을 수 있다는 것이 무슨 말일까요?
예를 들어 경영부가 서울 본사, 부산 지부, 울산 지부에 있는 거라고 생각할 수 있습니다.
이 때 경영부의 "위치"라는 애트리뷰트에 서울, 부산, 울산 등 여러 개가 들어갈 수 있게 됩니다.
이런 경우를 다치(Multi-valued) 애트리뷰트라고 하며 이중 타원으로 표시합니다.
우선 알려드릴 점은 먼저 나온 "관리"와 구별하기 위해 "담당" 이라고 적었습니다. 이는 예제 설정때 같은 단어를 써서 약간의 혼동이 있던 것으로, 실제 문제에서는 최소한 이런 모호한 점을 제거하여 출제됩니다.
다시 돌아와 ERD를 설명하자면 눈에 띄는 점은 부서와 프로젝트의 관계인데,
한 부서가 여러 프로젝트를 담당한다는 것을 뒤집으면 어떤 프로젝트는 하나의 부서에 의해 담당된다는 것입니다.
그렇기 때문에 부서와 프로젝트 간에 1:N 관계가 성립합니다.
그렇다면 전체 참여(이중 실선)는 무슨 의미를 가질까요? 한 번 단일 실선으로 바꿔보았습니다.
단일 실선을 사용하면 부서 중에 프로젝트를 담당하지 않는 부서가 있거나,
어떤 프로젝트는 담당 부서가 존재하지 않는다는 의미를 가집니다.
반면 이중 실선이라면 혼자 노는 부서, 프로젝트 없이 모든 부서가 프로젝트를 담당하고,
모든 프로젝트가 담당 부서가 있는 경우가 됩니다.
이는 mini-world가 어떻게 주어지는지에 따라 단일실선과 이중실선 중 무엇을 써야 하는 지 결정하면 됩니다.
우선 사원의 애트리튜브로 이름, 주민번호, 주소, 급여, 성별, 생년월일이 나와 있습니다.
여기서 주의할 점은, 따로 명시되어있지 않지만 애트리튜브 중에서 각 튜플을 구별할 수 있는 것은 무엇일까요?
바로 주민번호 입니다. 따라서 주민번호를 키 애트리튜브로 설정합니다.
이름은 동명이인이 있을 수 있고, 주소도 가족이라면 같을 수 있습니다. 급여, 성별, 생년월일도 충분히 같을 수 있죠.
이어서 한 사원은 한 부서에 속하고 한 부서에는 여러 사원이 있으니 1:N 관계를 맺어줍니다.
이 관계는 앞서 봤던 부서-프로젝트 관계와 유사한데,
부서를 배정받지 못한 사원이 있거나 빈 부서가 있다면 단일 실선,
만약 모든 사원이 소속 부서가 있고, 빈 부서가 없다면 이중 실선을 사용합니다.
반면 한 사원은 여러 프로젝트에 참여할 수 있다는데, 그렇다면 프로젝트 쪽은 N이 되는 것이 맞습니다.
사원 쪽이 문제가 되는데, 1:N으로 설정하면 혼자서 N 개를 참여한다는 사실만 담기게 됩니다.
반면 N:M으로 설정 시 한 프로젝트에 여러 명이 참여한다는 사실도 담기게 됩니다.
따라서 더 자연스러운 의미인 N:M으로 설정하게 됩니다.
이 또한 이중 실선을 사용하면 모든 사원이 어떤 프로젝트에 참여하고,
모든 프로젝트는 참여 사원이 있다는 뜻이 됩니다.
한 사원이 참여하는 프로젝트는 해당 사원의 소속 부서의 관할이 아니어도 무방하다는 말은,
사원~부서~프로젝트가 한 관계에 묶인 것이 아니고 서로가 이항적으로 연결되어있다고 이해했습니다.
이 부분은 설명하기 조금 모호하네요..
마지막으로 "주당 근무 시간"을 "참여"의 애트리튜브로 설정합니다.
일반적으로 한 사원의 상사 중에서도 "직속 상사"는 한 명 뿐이라고 생각하면,
한 명의 상사가 N명의 사원을 감독하는 것이므로 1:N 단일실선 관계로 볼 수 있습니다.
이 때, 상사와 사원 모두 사원에 속하기 때문에 supervisor와 supervisee로 역할 이름을 구분해 줄 필요가 있는데,
추후 설명하겠지만 이런 경우에는 사원의 애트리튜브에 Super_ssn을 넣어 자신의 직속 상사의 ssn을 적으면 됩니다.
부양가족은 사원이 존재함으로써 존재할 수 있는 엔티티 입니다.
이런 엔티티를 약한 엔티티 타입이라고 하며 이중 사각형으로 표현하고,
정규 엔티티 타입과 약한 엔티티 타입을 연결하는 이중 마름모를 식별 관계라고 합니다.
부양가족 중에서 튜플을 구분할 수 있는 애트리뷰트, 즉 키는 무엇일까요?
보편적으로 한 가정 안에 같은 이름이 있기는 힘들죠. 따라서 이름이 키가 되고,
이러한 약한 엔티티 내에서의 키를 부분 키(partial key)라고 합니다.
ERD에서는 부분 키를 점선 밑줄을 그어 표현합니다.
<틀린 점이 있다면 지적 부탁드립니다. 감사합니다.>
'전공 > Database' 카테고리의 다른 글
데이터베이스 : 관계 모델과 제약 조건 (0) | 2022.10.25 |
---|---|
데이터베이스 : EERD (Superclass, Subclass, Partial/Total, Disjointness/Overlap, 다중상속, Union) (0) | 2022.10.25 |
데이터베이스 : ERD #3 (애트리뷰트 유형, 관계 타입, NOT NULL, PK) (0) | 2022.10.24 |
데이터베이스 : ERD #1 (ERD의 개념) (0) | 2022.10.23 |
데이터베이스 : 개요 (0) | 2022.10.23 |
최근댓글