데이터베이스

ERD(Entity_Relation_Diagram)

Leo.K 2022. 4. 20. 09:11

ERD(Entity_Relation_Diagram)를 통한 테이블 구조 파악

릴레이션의 Join연산은 공통 속성을 중심으로 2개의 릴레이션을 하나로 합쳐서 새로운 릴레이션을 만드는 과정으로 

순수관계연산자의 종류 중 하나입니다.  Join연산은 ▷◁의 기호로 표시하며, 두 릴레이션 R과 S의 조인을 표기하는   

표기형식은 다음과 같습니다.

표기 형식 : R▷◁(JOIN 조건)S

 

조인연산의 개념을 명확하게 이해하기 위해서는 관계데이터베이스에서 각 개체들의 관계를 명확하게 이해할 필요가 있습니다. 사실상 DB를 직접 설계하고 구현하는 사람이 아니라면 실질적으로 ERD를 설계하는 일은 없겠지만,

일반 개발자 입장에서는 DB로부터 적절한 데이터를 검색하기 위해서 설계된 ERD를 보고 이해하며, 코드화할 수 있는 기능은 필요합니다.

설명을 위해 사용하는 ERD는 연습용 DB를 기반으로 구성했습니다.

필자는 국비지원학원에서 배포받은 erwin을 사용했습니다. 이번 포스팅은 개념을 설명하기 위함이므로, erwin에 대한 사용법은 구체적으로 설명하지 않겠습니다.

 

1. 참조무결성 제약 조건(부서 - 사원 관계)

참조무결성을 사전적 정의로 이해하기에는 비전공자들에겐 다소 난해하다고 생각합니다. 기본적으로 DB에 저장되는 데이터들은 중복성 및 종속성을 제거하고, 무결성(관련없는 데이터들을 삭제하는 것)을 지키기 위해서 제약조건을 설정하는데, 참조 무결성 또한 그 중 하나라고 생각하시면 됩니다. 다음 이미지를 보면서 설명하도록 하겠습니다.

위 이미지는 ERD에서 가장 기초적으로 볼 수 있는 구조입니다. 

현재 부서 릴레이션과 사원 릴레이션은 1 : n관계로 이루어져 있습니다. (연결된 다리 수를 보시면 이해가 되실 겁니다.)

한 부서에는 여러명의 사원이 존재하지만(부서 : 사원 = 1 : n), 여러 명의 사원이 한 부서의 속하므로 (사원 : 부서 = n : 1) 결론적으로 둘의 관계가 1 : n이 되는 것입니다.

 

이때, 사원 릴레이션에서는 "부서번호" 속성을 외래키로 사용하여 부서 릴레이션의 기본키인 "부서번호" 속성을 참조하고 있습니다.

이때, 외래키를 사용하여 참조하는 사원 릴레이션을 참조 릴레이션, 외래키에 대응되는 기본키를 가진 부서 릴레이션을 피참조 릴레이션이라고 합니다.

이때, 사원 릴레이션을 자식 릴레이션, 부서 릴레이션을 부모 릴레이션이라고도 부릅니다.

 

[두 속성의 이름이 같으므로 구분을 위해서 릴레이션의 이름을 붙이겠습니다.]

외래키인 사원.부서번호는 부서 릴레이션의 기본키인 부서.부서번호를 참조합니다. 

그렇다면 부서.부서번호에 없는 값을 사원.사원번호에 저장할 수 있을까요? 

 

예를 들어 설명해보겠습니다. 

부서.부서번호에 10, 20, 30, 40이라는 데이터가 저장된다고 가정해보겠습니다. 

여기서 참조한다는 말은 해당 필드의 데이터들을 기반으로 "참고"한다는 뜻입니다.

그렇다면, 사원.부서번호에 50이라는 데이터를 저장할 수 있을까요? 

가능하다면 그 50이라는 데이터는 어디서 가져온 것인가요? 

 

사원.부서번호는 부서.부서번호를 참고하기 때문에 부서.부서번호에 없는 내용은 추가할 수 없습니다.

이를 표현한 개념이 바로 참조 무결성 제약조건입니다. 

참조하고 있는 필드에 있는 내용만 참고해서 나의 필드의 데이터로 저장할 수 있다는 말입니다.

좀 더 쉽게 이해하실 수 있도록 실생활에서 예시를 들어보자면, 

주어진 레시피대로 음식을 만들어야 만점을 받는 시험(참조 무결성 제약조건)이 있다고 가정하겠습니다. 

그런데 레시피(피참조테이블)가 여러분에게 주어졌습니다. 

이런 상황에서 여러분은 레시피에 없는 재료를 요리(참조테이블)에 넣으실 겁니까?

(피참조테이블에 없는 데이터를 참조테이블에 넣으시겠습니까?)

 

위 그림의 내용을 코드화 하면 다음과 같습니다. 

1
2
3
alter table sawon 
    add constraint fk_sawon_deptno foreign key(deptno)
                                    references dept(deptno)
cs

2. 사원 - 사원 관계

위의 예시는 다른 릴레이션을 참조하는 경우이고,

이번에는 자기 자신의 릴레이션에서 참조하는 경우를 생각해보겠습니다.

[참조하는 속성과 참조되는 속성이 같은 릴레이션에 있기 때문에 이번에는 릴레이션 이름을 붙이지 않겠습니다.]

테이블 구조에서 상사번호(외래키)는 사원번호(기본키)를 참조합니다.

상사번호는 현재 직급을 기준으로 나보다 상사인 사람의 사원번호를 저장하는 필드입니다.

이때 내가 우리 팀에서 1등인 부장이라면? 나보다 상사가 없기 때문에 Null값이 존재할 수 있습니다.

또한, 내가 일반 사원인데 내 위에 입사 동기인 대리님이 2명이 있다면, n명의 상사가 존재할 수 있습니다. 

마지막으로, 내 사수가 단 한명이라면, 1명의 상사가 존재할 수 있습니다. 

참조 무결성에 대한 설명은 위에서 했기 때문에 생략하겠습니다.

 

위 그림의 내용을 코드로 구현하면 다음과 같습니다.

1
2
3
alter table sawon 
    add constraint fk_sawon_samgr foreign key(samgr)
                                    references sawon(sabun)
cs

 

3. 사원 - 고객 관계

전체적인 ERD완성은 다음과 같습니다. 

1명의 사원이 여러 명의 고객을 관리하므로 관계는 1:n이 됩니다. 참조무결성 제약 조건은 위에서 설명한 부서-사원 

관계와 동일하기 때문에 별도의 설명 없이 코드만 첨부하고 지나가도록 하겠습니다.

1
2
3
alter table gogek
add constraint fk_gogek_sawon foreign key(godam)
                                references sawon(sabun) 
cs

 

4. 테이블을 분리해서 관리하는 이유

지금까지 조인을 좀 더 수월하기 이해하기 위해서 각 테이블 사이에 관계를 설명했습니다. 

본격적으로 조인을 공부하기 이전에 마지막으로 테이블을 분리하여 관리하는 이유에 대해서 살펴보겠습니다. 

위와 같은 테이블 구조를 보겠습니다. 위에서 부터 이해하면서 보셨으면 아시겠지만, 사원 테이블과 부서 테이블을 합쳐서 하나의 테이블로 구성한 경우입니다.

부서명과 위치필드는 하나의 부서번호에 대응되는 관계이기 때문에 데이터의 중복이 발생할 수 있습니다.

예를 들어 위의 이미지를 구현한 테이블의 내용이 다음과 같다고 생각해보겠습니다.

서로 다른 세명의 사원이 있는데 세 명의 사원은 같은 부서이기 때문에 부서명과 위치 컬럼에 같은 데이터를 반복적으로 저장합니다. 이는 부서명과 위치의 정보가 전체적으로 봤을때 1명의 사원에 대한 정보를 저장하는 사원테이블과는 관련성이 떨어진다는 의미입니다. 그 결과로 중복된 데이터를 저장하기 위해 필요 이상의 저장공간의 낭비를 초래하며, 데이터베이스에 데이터를 저장할 때는 이러한 중복성을 정규화를 통해 제거합니다.

 

 

 

마지막으로, 위에서 처럼 애써 분리한 테이블을 왜 다시 Join(결합)하는 거야? 라는 질문을 가질 수 있다고 생각하여 이에 대한 해답만 제시하고 마무리하겠습니다. 

결론적으로 말하면, 

 

join은 저장의 개념이 아니라 조회의 개념입니다.

 

select문을 통해 조회된 테이블은 조회를 목적으로만 일시적으로 사용되는 것이기 때문에 저장되지 않습니다. 

join또한 마찬가지입니다. select명령으로 조회를 하고자 할 때, 사원 정보가 필요한데, 이 사원이 포함된 부서의 이름과 위치가 알고 싶어!라고 생각을 한다면, join명령을 통해 일시적으로 생성한 조회테이블로 조회하는것입니다.

 

한 가지의 예시만 들도록 하겠습니다.

위와 같은 구조로 생성된 테이블이 있다고 가정하겠습니다. 

예를 들어,

1번 고객이 물품을 구매하려고 합니다. 그렇다면 쇼핑몰을 관리하는 개발자인 우리는 물품을 판매할 금액을 계산해서 고객에게 요금을 청구해야 합니다.

금액을 계산하는 방법은 다음과 같습니다.

금액 = 수량 * 단가 * (1-할인율)

 

금액을 계산하기 위해서는 등급.할인율과 고객.고객번호, 구매.수량, 상품.단가필드가 필요합니다. 이를 위해서 네개의 테이블을 다시 합치는 것은 말도 안되는 일이고, 비효율적입니다.

이런 경우에 join연산을 이용해서 현재 필요한 필드 정보만을 결합해 일시적으로 구성한 테이블로 원하는 결과를 조회할 수 있습니다.

 

정리

1. 참조무결성이란 피참조 테이블에 없는 내용을 참조테이블에서 사용할 수 없다는것을 말합니다.

2. DB는 중복 데이터 제거를 위해 관련없는 필드를 제거함으로써 테이블을 분리시킨 상태로 저장하고 관리합니다.

3. 여러 개의 테이블의 필드가 필요할 때는 join연산을 통해 결합한 데이터를 조회할 수 있습니다.

4. join연산에서 결합의 조건은 참조무결성을 위해 지정한 공통된 속성의 값, 즉 외래키와 기본키입니다. 

'데이터베이스' 카테고리의 다른 글

Tomcat다운로드&환경설정_HTML_국비_DAY40  (0) 2022.04.26
JDBC 실습_국비_DAY39  (0) 2022.04.22
DB 모듈화  (0) 2022.04.22
JDBC의 사용법  (0) 2022.04.21
Join  (0) 2022.04.20