위의 ERD에서 "세트메뉴, 메뉴재료"는 식별관계이고 "세트, 메뉴"는 비식별관계이다. 위의 Table들의 어떤 특성을 통해 이를 알 수 있을까?
식별 관계란, 부모 테이블의 기본키 또는 유니크 키를 자식 테이블이 자신의 기본키 로 사용하는 관계이다. 부모 테이블 키가 자신의 기본키에 포함되기 때문에 반드시 부모 테이블에 데이터가 존재해야 자식 테이블에 데이터를 입력할 수 있다. 즉, 부모 데이터가 없다면 자식 데이터는 있을 수 없다. ER도형에서 식별관계는 실선으로 표시된다.
비식별 관계란, 부모 테이블의 기본키 또는 유니크 키를 자신의 외래키로 사용하는 관계이다. 자식 데이터는 부모 데이터가 없이도 독립적으로 생성될 수 있다. 구조 변경이 용이하므로 현업에서 자주 사용된다. ER 도형에서 점선으로 표기한다.
외래키와 부모, 자식테이블은 무엇일까?
참조되는 테이블을 부모 테이블이라 하고, 참조하는 테이블을 자식테이블이라 한다. 예를 들어 외래키의 경우, 외래키가 포함된 테이블을 자식 테이블이라 하고 외래키값을 제공하는 테이블을 부모 테이블이라 한다.
밑에서는 user_id를 외래키로 참조하고 있는 주문이 자식테이블이고, 참조 당하고 있는 유저가 부모테이블 이다.
처음에 제시한 ERD를 살펴보면, 메뉴그룹의 기본키를 "세트"와 "메뉴"테이블이 외래키로 참조하고 있다. 따라서 부모테이블은 "메뉴그룹", 자식테이블은 "메뉴", "세트"이다.
이번에는 반대로, "세트메뉴" 테이블이 "세트", "메뉴"테이블의 기본키를 참조하고 있고, "메뉴재료" 테이블이 "메뉴", "재료" 테이블의 기본키를 참조하고 있다. 따라서 부모테이블은 "세트", "메뉴"이고, 자식 테이블은 "세트메뉴", "메뉴재료" 이다.
온라인 마켓의 주문에 대한 테이블이다. Marco라는 동일 회원이 4개의 제품에 대한 주문을 요청했다. 주문자가 동일하므로 좌측의 주문자와 관련된 데이터들은 다 동일하다. 그러나 각각의 제품이 다르므로 우측의 제품과 관련된 데이터는 모두 변경된다. 이렇게 주문과 사용자의 정보가 하나의 테이블에 있으면 엄청난 데이터 중복이 발생하는 문제가 생긴다.
이 같은 데이터 중복 문제를 해결하기 위해, 사용자 테이블과 주문 테이블을 분리 할 수 있다. 그러나 주문테이블의 경우 우측의 푸른색 데이터만 가지고 있으면 문제가 될 수 있다. 누가 주문을 했는지 알 수 없기 때문이다.
이 문제를 해결하기 위해, 주문 테이블에 사용자 테이블을 찾을 수 있는 정보를 추가하면 된다. 주문 테이블의 마지막에 사용자 테이블의 기본키를 추가하면 중복된 데이터 없이 관리하고, 사용자 아이디 정보를 통해 필요한 사용자 정보도 찾을 수 있게 된다. 주문 테이블에 존재하는 이같은 사용자 아이디 정보(기본키)를 외래키(Foriegn Key)라 부른다.
이해가 어려웠던 것은 Primary key, Foreign key가 표시되지 않아서였던것 같다.
📌
- 식별관계 : 부모 테이블(=참조되는 테이블)의 기본키를 자식테이블(=참조하는 테이블)의 기본키로 이용하는 방법.
- 비식별관계 : 부모 테이블(=참조되는 테이블)의 기본키를 자식테이블(=참조하는 테이블)의 외래키로 이용하는 방법.