기본키 : 테이블의 하나의 행의 여러 정보들 중 이를 식별해 낼 수 있는 정보
외래키 : 테이블간의 관계(참조하는 테이블과 참조되는 테이블 간의 관계)
식별 관계
- 부모 테이블의 기본키 또는 유니크 키를 자식 테이블이 자신의 기본키로 사용하는 관계
- 부모 테이블의 키가 자신의 기본키에 포함되기 때문에 반드시 부모 테이블에 데이터가 존재해야 자식 테이블에 데이터를 입력할 수 있다. 즉, 부모 데이터가 없다면 자식 데이터는 생길 수 없다.
- 식별관계는 ERD상에서 실선으로 표시한다
바퀴는 자동차 테이블에 데이터가 존재해야 생성할 수 있다. 즉, 부모 테이블에 자식 테이블이 종속된다.
상품테이블과 주문테이블의 기본키인 상품번호와 주문번호가 주문상품 테이블의 외래키가 되었다. 그리고 이 두 외래키는 주문상품테이블의 정보를 식별할 수 있는 기본키(2개이상의 컬럼도 기본키로 구성될 수 있다.)의 역할도 하게된다.
이러한 관계를 식별관계라고한다.
정리
- 부모테이블(상품, 주문테이블) 기본키(PK)가 자식 테이블(주문_상품)의 외래키이자 기본키로 사용되는 관계이다.
- 자식 테이블의 행(정보)를 추가할 때 부모테이블의 참조 행(상품번호 또는 주문번호)이 없다면 자식테이블의 행을 추가 할 수 없다.
: 주문_상품테이블은 상품번호와 주문번호 중 하나라도 없다면 기본키를 만들 수 없게 되고(두개의 외래키가 합쳐 기본키가 되므로) 기본키가 없어 정보를 식별할 수 없으므로 데이터를 넣을 수 없다.
: 예를 들면 게시판의 작성글과 댓글의 관계를 식별관계라고 할 수 있다.(작성글이 없다면 댓글도 없다)
비식별 관계
- 부모 테이블의 기본키 또는 유니크 키를 자신의 기본키로 사용하지 않고, 외래 키로 사용하는 관계
- 자식 데이터는 부모 데이터가 없어도 독립적으로 생성될 수 있다.
- 부모와의 의존성을 줄일 수 있기 때문에 조금 더 자유로운 데이터 생성과 수정이 가능하다.
- ERD에서는 점선으로 표시한다.
주문상품번호라는 기본키를 추가하였다.
주문상품번호로 주문_상품테이블의 정보들을 식별할 수 있게 되고 외래키(상품번호와 주문번호)는 테이블의 일반속성이 되었다.
비식별관계에 대해 정리하면
- 부모 테이블(상품, 주문테이블) 기본키가 자식 테이블(주문_상품테이블)의 일반컬럼이나 외래키(Foreign Key) 컬럼에 저장되는 관계이다.
- 자식 테이블의 행(정보)를 추가할 때 부모테이블의 참조 행(상품번호 또는 주문번호)이 없어도 자식테이블의 행을 추가 할 수가 있다.
: 예를 들면 회사의 부서와 사원의 관계를 비식별관계라고 할 수 있다. (사원이 부서가 배정되지 않을 수도 있으므로)
장단점
식별 관계의 장점
- 데이터의 정합성 유지를 DB에서 한번 더 할 수 있다
- 자식 테이블에 데이터가 존재한다면 부모 데이터도 반드시 존재한다고 보장할 수 있다
식별 관계의 단점
- 요구사항이 변경되었을 경우 구조 변경이 어렵다
비식별 관계의 장점
- 변경되는 요구사항을 유동적으로 수용할 수 있다
- 부모 데이터와 독립적인 자식 데이터를 생성할 수 있다
비식별 관계의 단점
- 데이터 정합성을 지키기 위해서는 별도의 비즈니스 로직이 필요하다.
- 자식 데이터가 존재해도 부모 데이터가 존재하지 않을 수 있다
- 즉, 데이터 무결성을 보장하지 않는다
cf) 위의 그림에서 비식별관계는 주문상품번호라는 기본키를 임의로 추가하여 만들었다. 이렇게 추가한 키를 인조키라고 하는데 기본키를 인조키로 설정하는 것이 권장된다.
자연키 : 비즈니스 모델에서 자연스레 나오는 속성으로 기본키를 정함
인조키 : DBMS적인 측면에서 본다면 Oracle의 Sequence, MySQL의 Auto Increment와 같이 비지니스 모델과 상관없음
참고