매번 프로젝트 때마다 erd를 설계하기는 하지만 매번 헷갈리는게 바로 identifying & non-identifying relationship의 차이점이다.
이번 기회에 확실히 알고 가기 위해 이 글을 작성한다.
이 둘에 대해 알아보기 전에 RDBMS의 기본적인 용어들을 정리하고 가자.
(key들에 관해서는 정말이지 매번 헷갈린다.)
✏️ "Composite key(복합 키)"
✏️ "Alternative key(대체 키)"
⭐ 식별관계(Identifying Realtionship)와 비식별관계(Non-Identifying Relationship) 은 RDBMS에서 나누는 관계가 아닌, ER Diagram 상에서 논리상 나누는 개념이다.
=부모 테이블의 기본키(PK) 또는 복합키가 자식 테이블의 기본키 또는 복합키의 구성원으로 전이되며, 관계는 서로 종속되게 된다.

= 자식 테이블의 일반 속성(Attribute) 그룹의 구성원으로 전이되는 비식별관계로, 부모는 자식의 부분적인 정보만을 표현한다.

Non-Identifying Relationship의 경우 B테이블이 A와 FK의 관계를 맺고 있긴 하지만, 독립적으로 존재할 수 있어야 한다. 즉, FK가 B테이블의 PK가 되어서는 안된다.
🤔 내가 설계하려는 erd 에서는 어떨까?
나는 user가 자신만의 여러 개의 space(공간)을 생성할 수 있도록 해야 한다. user가 없으면 space는 존재할 수 없다.
∴ 고로, 이 둘은 Identifying Relationship(식별관계) 여야 한다.
그리고 이 공간(space)에 업로드할 콘텐츠(item)와의 관계도 설정해야 한다.
이때, item은 space가 없어도 존재할 수 있다. 따라서 비식별관계로 설정하였다. 그런데, 여기서 헷갈리는 지점이 생겼다. 공간(space)는 이미 space_id를 PK로, user_id를 FK로 설정하였다. 이렇게 되면 item에서 참조되는 id가 space_id, user_id가 된다. 이 두개를 무조건 모두 참조해야 하는지, 혹은 하나만 참조해도 되는지 헷갈리기 시작했다.
우선 필요한 기능상 item을 클릭하면 해당 user의 정보가 검색되는 기능이 필요했으므로, 두 개의 field를 모두 참조하기는 했지만, 원칙상 어떻게 해야하는지는 아직도 잘 모르겠다.
또한, item과 space의 관계에서 어떤게 자식이고, 부모인지 헷갈린다. 아무래도 자식 테이블과 부모 테이블에 대해 좀 더 자세히 공부해야 겠다.
space에 여러 개의 tag를 설정할 수 있는 기능도 존재하는데, tag는 space와 별도로 존재할 수 있으므로, 이 또한 Non-Identifying Relationship(비식별관계)로 설정하였다.
tag를 이용하는 기능에도 마찬가지로 user_id가 필요해서 space_id, user_id field 모두를 참조하였다.
또다른 궁금증이 생겼다. user_id가 필요한 경우,
space_id만 참조해서 해당 space_id를 이용해서 다시 user_id를 찾는 방식으로 api를 작성하는 방식이 나을까,
혹은 지금처럼 entity 자체에서 user_id, space_id 두개의 필드를 모두 참조하여 space_id를 통해 찾지 않아도 되는 방식이 더 효율적일까? 🤨
더 공부해보면서 해결 방법을 찾아야 할 것 같다.
우선 이게 현시점에서의 erd이다.
