상세 컨텐츠

본문 제목

엔티티 종속, 참조관계

기록 - 프로그래밍/Data

by wjjun 2024. 4. 30. 12:09

본문

 

관계는 두 개 이상의 엔티티 간 존재하는 연관성을 의미합니다.

엔티티 연관성에는 두 가지 종류가 있습니다.

종속 관계, 참조 관계입니다.

 

종속 관계는 부모 엔티티와 자식 엔티티 간 관계로 부모 엔티티가 없으면 자식 엔티티가 존재할 수 없는 관계입니다.

참조관계는 단지 어떤 엔티티와 연관성이 존재해서 관리하려는 관계일 뿐 상위 엔티티가 없다고 존재할 수 없는 관계는 아닙니다.

 

 

데이터 모델이 요건에 의해 결정되듯 종속 관계로 요건에 따라 달라집니다.

종속관계를 느슨하게 관리하면 확장성은 좋아지게 됩니다.

팀은 반 반드시 리그에 종속돼 있다는 요건이 팀이 소속된 리그는 변경될 수 있다는 요건으로 바뀔때 아래 모델에 아무런 변화를 주지 않아도 요건을 만족할 수 있습니다.

 

참조 관계

종속 관계의 엔티티와 다르게 참조 관계의 엔티티는 상위 엔티티의 주 식별자를 하위 엔티티의 주 식별자로 상속하지 않습니다.

 

리그 테이블 - 리그번호(PK) / 리그명

팀 테이블 - 팀번호(PK) / 팀명 / 리그번호

 

종속 관계

반면 아래 모델에서는 리그와 팀이 종속 관계로 묶여 있어 모델을 수정하지 않고서는 요건을 충족할 수 없습니다.

 

리그 테이블 - 리그번호(PK) / 리그명

팀 테이블 - 팀번호(PK) / 팀명 / 리그번호(FK)

 

엔티티 간 연관성인 관계를 명확히 하려면 선결적인 필수 조건은 엔티티의 정의가 명확해야 합니다. 엔티티가 자립 엔티티인지 종속 엔티티인지를 명확하게 결정하는 것으로 부터 관계를 명확히 하는 첫 걸음입니다.

 

엔티티와 식별자 식별자 사이처럼 엔티티 정의와 관계 정의 사이에도 밀접한 연관성이 존재합니다. 데이터 모데링은 전체가 아우러져 있어 어느 한 부분만 알아서는 제대로 수행하기가 어렵습니다. 엔티티와 식별자, 속성, 관계 등은 불가분의 관계이며 엔티티를 명확히 도출하는 것이 모델링의 첫 시작입니다.

 

실무에서 경험할 수 있는 것이 잘못 표현된 관계입니다. 관계는 모델에서 관계선으로만 보이고 실상은 보이지 않는 것으로 여겨 관계를 표현한다 라는 말을 자주 사용합니다. 관계선을 긋는다 라는 표현과 같습니다. 이렇게 선으로 표현된 관계의 실상은 속성입니다.

 

관계선은 DBMS에서 참조 무결성 제약으로 구현됩니다. 그래서 모델에서 관계선은 개념만 존재할 수 있지만 데이터베이스에서는 분명한 실상이 존재하게 됩니다.

 

DBMS에서 참조 무결성 제약을 생성하지 않으면 관계선을 굳이 모델에 표현할 필요가 없다고 생각할 수도 있습니다. 하지만 관계선에 여러 의미가 포함돼 있습니다. 가장 중요한 의미는 관계선을 보고 업무 규칙을 알 수 있는 것입니다.

 

관계 속성만 존재하고 관계선이 없다면 종속 관계인지 알 수 없거나 추측해야 합니다. 상위 엔티티의 주 식별자와 하위 엔티티의 속성을 연결시켜 주는 것이 관계선입니다. 그리고 관계선은 데이터를 입력할 때 입력 순서를 의미합니다.

 

상위 엔티티에 데이터가 존재하는지 먼저 확인해야 하고 관계선은 데이터를 조회할 때 조인하는 경로를 의미하기도 합니다.

 

관계선을 잘못 표현하는 유형 두 가지

엔티티 간 연관성이 존재하는데 관계를 표현하지 않는 경우가 있습니다.

연관성이 없는데도 관계를 표현하는 예가 있습니다.

 

전자는 엔티티가 명확하지 않아 관계가 도출이 안되거나 연관성 자체를 도출하지 못하는 것입니다. DBMS에서 참조 무결성 제약도 생성하지 못할 것입니다.

 

후자는 복합적인 원인이 있을 수 있습니다. 관계 중요성을 인식하고 있지만 관계의 의미를 확실히 모르는 상태에서 엔티티 간 연관성이 조금이라도 보이면 관계선을 표현하는 경우가 있습니다.

 

가장 중요한 것은 관계선을 보고 업무 규칙을 알 수 있다는 것입니다.

 

 

A 테이블 - a 

B 테이블 - b / a (FK)

C 테이블 - c / b (FK)

D 테이블 - d / c (FK) / b (FK) / a (FK)

 

위와 같은 테이블은 중복 속성이 다수 발생하여 정합성을 유지하기 어렵고 관리에도 어렵습니다. 결국 RDB 사상과 다른 모델이 됩니다.

 

 

관계와 속성 엔티티

관계를 속성이라고 생각합니다. 다른 엔티티와 연관성을 알 수 있는 속성입니다. 속성이 존재해야 관계가 성립됩니다.

상위 엔티티 주 식별자가 하위 엔티티 속성으로 관리됩니다. 하위 엔티티의 속성으로 관리될 때만 관계를 표현합니다.

 

속성에 데이터 생성 순서 개념이 존재하는 것이 일반 속성과 다른 점입니다. 하위 엔티티 속성의 데이터는 상위 엔티티의 속성에 존재해야 합니다.

 

모델에서 사원이 현재 근무하고 있는 부서가 어디인지를 관리합니다. 현재 근무부서 번호 속성이 부서 엔티티와 연관되어 관계선이 표현돼 있습니다. 사원 엔티티 상위 엔티티 중 하나는 부서 엔티티 입니다.

 

현재 근무부서번호 속성은 널(NULL)이 허용됩니다. 어떤 사원에 대해서는 현재 근무하고 있는 부서를 모른다는 것을 의미합니다. 데이터가 생성되는 시점에 정해지지 않았다는 것을 의미하기도 합니다. 두 엔티티 관계는 참조 관계 입니다.

 

참조 관계

부서 테이블 - 부서번호 (PK) / 부서명

사원 테이블 - 사원번호 (PK) / 사원명 / 현재근무부서번호(FK)

 

참조 무결성 존재하지 않는 관계

부서 테이블 - 부서번호 (PK) / 부서명

사원 테이블 - 사원번호 (PK) / 사원명 / 현재근무부서번호

 

릴레이션에서 현재근무부서번호 속성과 연관되는 상위 엔티티의 속성은 부서번호입니다. 

그래서 현재근무부서번호 속성 값은 부서번호 속성에 존재하거나 널(NULL) 이어야 합니다.

 

이 경우 부서 테이블에 없는 번호가 사원 테이블 현재근무부서번호로 값이 입력되어 있으면 안됩니다.

그래서 오입력을 막기 위해 참조 무결성 제약을 설정합니다.

 

 

 

 

관련글 더보기

댓글 영역