본문 바로가기

Database(DB)

[ERD] 식별 관계와 비식별 관계

 SQLD 시험 공부를 하거나 ERD(Entity Relationship Diagram)을 그리다 보면 식별과 비식별의 차이에 대해서 헷갈려하는 경우가 생긴다. 식별 관계는 실선, 비식별 관계는 점선으로 나타내는데 뭐가 다른지 쉽게 이해해보자.

 

 

 우선 핵심만 말하자면 부모 테이블에 있는 PRIMARY KEY가 자식 테이블의 PRIMARY KEY로 포함되는지 여부식별비식별로 나뉜다. 즉, 자식 테이블이 독립적으로 유일성을 가질 수 있으면 비식별 관계이고 자식 테이블이 부모 키 없이는 유일성을 가질 수 없어서 부모 테이블에 있는 PRIMARY KEY를 자식 테이블 PRIMARY KEY에 추가해야 한다면 그것은 식별 관계이다. 이렇게 말하면 이해하기 어려울 수 있으니 직접 예시를 보자.

 

식별 예시

 아래는 주문 테이블과 주문 상세 테이블이다. 주문을 하면 order 테이블(부모 테이블)에 있는 order_id(주문 번호)가 주문별로 부여가 된다. order_detail 테이블(자식 테이블) 에서는 각각의 주문에 대한 상세 정보를 나타내려면 부모 테이블(order 테이블)에 있는 order_id 값을 가져와야 하는 상황이다. item_id(물건 번호) 만으로는 상품만을 나타낼 뿐 각각의 행(튜플)의 유일성을 보장하지 못한다. order_id가 없이 item_id만 있다면 다른 주문에서도 동일한 item_id가 있으면 item_id만으로는 구별을 할 수가 없다. 그렇기에 부모 테이블(order)에 있는 order_id와 자식 테이블(order_detail)에 있는 item_id 두개를 복합키로 구성하여 유일성을 보장하는 것이다.

 

CREATE TABLE order (
    order_id BIGINT PRIMARY KEY
);

CREATE TABLE order_detail (
    order_id BIGINT,   -- 부모 키 포함
    item_id BIGINT,    -- 추가 키
    quantity INT NOT NULL,
    PRIMARY KEY (order_id, item_id),  -- 부모 키 포함하여 복합 PK 구성
    FOREIGN KEY (order_id) REFERENCES order(order_id)
);

 

 

 

비식별 예시

 비식별 관계는 부모 테이블에 있는 PRIMARY KEY가 자식 테이블에 포함되지 않는 경우를 말한다. 즉 자식 테이블만으로도 유일성이 보장되는 것이다.  아래는 user(사용자)와 comment(댓글) 테이블이다. 자식 테이블(comment)에서 부모 테이블(user)에 있는 user_id 키를 외래키로 가져와서 사용하고 있지만 자식 테이블의 PRIMARY로 만들 필요가 없는경우이다. 왜냐하면 comment_id(댓글 번호) 만으로도 충분히 각각의 댓글을 구별할 수 있기 때문이다. 댓글 번호 1번, 2번, 3번 이렇게 구별하는 것은 굳이 user_id가 없더라도 각각 유일성을 보장한다.  

 

CREATE TABLE user (
    user_id BIGINT PRIMARY KEY
);

CREATE TABLE comment (
    comment_id BIGINT PRIMARY KEY,  -- 댓글 ID (자체적으로 유일함)
    user_id BIGINT NOT NULL,  -- 부모 테이블과 관계는 있지만 PK 아님 (FK)
    content TEXT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES user(user_id)
);

 

즉, 식별과 비식별 관계는 강한 종속성과 약한 종속성에 빗대어서 얘기할 수 있다. 식별 관계는 부모 테이블이 없으면 자식 테이블이 없는 것과 같고 비식별 관계는 비교적 독립적으로 존재하는 약한 종속성의 관계인 것이다. 그러니까 식별 관계는 무결성을 강력하게 보장하는 반면 유연성이 떨어지고 비식별 관계는 유연성은 높지만 데이터의 무결성을 비지니스 로직으로 추가적으로 관리해야 할 수도 있어서 상황에 맞게 사용하면 될 것입니다.