본문 바로가기
카테고리 없음

기본키 / 식별-비식별 관계 / ERD IE 표기법

by 찐세 2021. 5. 1.

다른 데이터베이스의 ERD를 보다가 의문점이 발생해서 찾아보게 되었다. 

 

지금까지 다대다 관계를 형성하기 위해서 연결 테이블을 설정할 때, 연결 테이블의 기본키 값은 당연히 외래키(관계를 형성하는 두 테이블의 기본키)로 구성된  복합키라고 생각을 했고 그렇게 배웠다. 

 

하지만 모든 관계테이블에 외래키와 별개로 ID값을 지정해주고 이를 기본키로 사용하는 것을 알 수 있었다. 

 

굳이 왜 이렇게 하는 것인지 궁금해서 찾아보게 되었고 많은 것을 알 수 있었다.

 

 

 

 

자연키와 인조키


우선 먼저 자연키와 인조키에 대해서 정리해보겠다. 

 

테이블의 기본키를 선택할때 자연키와 인조키라는 옵션을 고민할 수 있다.

 

 

1. 자연키

우선 자연키라는 것은 기본키만을 위한 데이터가 아니라 비즈니스 모델에서 자연스럽게 나오는 속성으로 기본키를 정한다고 해서 자연키라고 한다.

 

우선 기본키라는 것은 테이블에서 레코드의 유일성을 보장하는 필드를 의미한다.

 

비즈니스적으로 사용자들의 닉네임을 중복이 불가능한 값으로 제한한다면 이는 회원(레코드)를 구분하는 기본키로서의 역할을 할 것이다. 

 

이렇게 비즈니스적으로 자연스러우면서 기본키로서의 역할을 할 수 있는 것을 자연키라고 한다.

 

 

 

2. 인조키

다음과 같은 테이블이 있다고 가정해보자

 

이 테이블의 필드중에서는 기본키로 설정할만한 필드는 보이지 않는다. 

 

하지만 이 테이블 또한 레코드를 구분할 기본키는 필요로 하기 때문에 기본키를 우리가 부여할 수 있다. 

 

이 처럼 예약자 ID 라는 필드를 기본키로 사용하기 위해서 설정할 수 있다. 

 

이는 Oracle의 sequence 또는 MySQL의 Auto Increment 라고 보면 된다. ( 자동 생성 증가값..? 이라고하면 되려나)

 

이처럼 비즈니스 모델과는 별개로 기본키만을 위해서 사용하기 때문에 인조키라고 한다.

 

 

3. 자연키? 인조키? 

그렇다면 위처럼 비즈니스상에서 기본키로 사용할만한 필드가 존재하면 자연키를 사용하고, 그렇지 않으면 인조키를 사용하면 되는 것일까?

 

물론 이보다 더 복잡한 이유로 둘의 사용 여부는 달라질 것이다. 

 

하지만 보통은 인조키를 사용하는 것이 좋고, 그것을 권장한다고 한다. (실제로는 비즈니스적이고 복잡한 이유로 자연키와 인조키의 사용여부를 결정하는데 아직 그 정도의 수준이 아니라 인조키를 권장한다는 것만 알고 넘어가도록 하겠다) 

 

기본키의 값은 최대한 변하지 않는 값이 좋다. 실제 필드의 데이터의 변경뿐 아니라 해당 필드가 의미하는 바도 변하지 않는 것이 좋다. 

 

예를 들어 우리나라는 개인에게 고유한 주민등록번호가 부여된다. 그렇다면 이를 기본키로 사용할 수 있을 것이다. 하지만 요즘은 정부의 보안 정책 때문에 회원 정보에서 주민등록번호의 전체를 요구하는 경우는 드물다. 

만약 이러한 정책이 생기기전에 주민등록번호를 기본키로 사용하는 서비스가 있었다면 골치 아플 것이다. 심지어 다른 테이블의 외래키로도 사용되었다면 문제는 더 복잡해진다. 

이처럼 기본키는 실제 데이터는 물론 의미하는 바도 최대한 변하지 않는 것이 좋다.

그렇기 때문에 별도의 인조키를 부여하면, 이는 단순 레코드를 구분하기 위한 중복되지 않는 순서값이므로 의미가 변할 이유도 값이 변할 이유도 없다. 

그렇기 때문에 인조키를 권장하는 것같다.

 

 

그래서 다대다 관계를 형성하는데 연결 테이블의 기본키가 외래키의 조합이 아니라 모두 인조키로 구성이 되어있었다. 

 

그리고 연결 테이블을 인조키로 구성하느냐 자연키로 구성하느냐에 따라서 식별 관계와 비식별 관계로 분류되고, ERD에서 표현법도 달랐다. 

 

 

 

 

 

 

 

식별관계? 비식별관계?


두 테이블의 다대다 관계를 테이블로 표현하기 위해서는 별도의 연결 테이블이 필요하다.

 

그리고 그 연결 테이블은 두 테이블의 기본키를 각각 외래키로 참조를 할 것이다. 

 

이 외래키를 기본키로 사용을 하냐, 그렇지 않냐에 따라서 식별 관계와 비식별 관계를 나눌수 있다.

 

 

이 처럼 두 테이블은 다대다 관계를 형성할 수 있다.

 

한 상품은 여러 주문에 포함 될 수 있고, 하나의 주문은 여러 상품을 포함할 수 있다.

 

 

1. 식별 관계

 

식별 관계는 이처럼 관계를 가지는 테이블의 외래키를 기본키로 사용하는 것을 말한다. 

 

 

 

2. 비식별 관계

 

비식별 관계는 이처럼 외래키를 기본키로 사용하지 않고 일반 필드로 사용하는 경우를 의미한다. 

 

앞서 살펴봤던 것처럼, 비즈니스 모델의 변경에도 영향을 덜 받기 위해서 인조키를 사용하는 것이다. 

 

이러한 형태는 단순히 인조키를 사용했다는 차이만 있는 것이 아니라, 기능상의 차이도 존재한다. 

 

식별관계의 예시에서는 한 주문에서 동일한 물건을 중복해서 구매 할 수 없다. 하지만 비식별 관계에서는 그것이 가능하다. 원래 서비스에서는 상품 수량이라는 필드를 생성하고 관리하겠지만, 현재 예시에서는 이렇다는 말이다.

 

이처럼 관계테이블에서도 식별관계보다는 인조키를 사용한 비식별 관계를 권장한다고 한다. 

 

 

 

 

 

IE 표기법


IE 표기법은 ERD를 더욱 축약하여 쉽게 표현하기 위해, 소프트웨어에서 흔히 사용되는 방법이다. 

 

DBMS 소프트웨어, IDE 등에서 이러한 형태의 다이어그램을 사용한다.

 

항상 헷갈렸었던 내용이다.

 

이 다이어그램으로 한번 더 정리해보자.

 

 

우선 하나의 상품은 여러 주문에 포함이 될 수 있기 때문에 주문_상품 테이블과 1대다로 연결된다.

 

마찬가지로 하나의 주문은 여러개의 상품을 포함할 수 있기 때문에 주문_상품 테이블과 1대다로 연결된다.

 

1 : 하지만 하나의 주문_상품이 존재한다면 상품은 반드시 하나가 있어야한다.(최소 참여가 1 + 오직 한개만 대응)

2 : 그리고 하나의 상품에 대해서 관련있는 주문이 하나도 없을수도 있다.(최소 참여가 0)

 

3 : 그리고 하나의 주문_상품이 존재한다면 주문은 반드시 하나가 있어야한다.(최소 참여가 1 + 오직 한개만 대응)

4 : 하나의 주문에 대해서 관련있는 상품이 하나도 없을수는 없다.(최소참여가 1)

 

 

 

REFERENCE


multifrontgarden.tistory.com/180?category=471242

 

multifrontgarden.tistory.com/181

 

mangkyu.tistory.com/27