1. 문제
ERD를 작성하다 보면 ERDCloud를 많이 사용한다. 그런데 관계를 맺을 때 Identifying Relationship, Non-Identifying Relationship에 대해서 고민해 본적이 있지 않은가? 그리고 다들 JPA를 사용할 때 ID 값을 기본적으로 사용하는데 이 과정에서 팀 간 의사소통에 혼란이생길 수 있다. 즉 "Identifying Relationship은 파란색이고 Non-Identifying Relationship은 분홍색이기 때문에 이뻐서 파란색^^;;;"라고 생각하면 당장 고쳐야 한다. 특히 JPA를 사용하는 사람이면 더욱 조심해야한다.
JPA에서는 식별자 관계를 명시적으로 쓰길 권장하고, 책 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'에 저자께서 이런 말을 하신다.
웬만하면 Entity의 PK는 Long 타입의 Auto_increment를 추천합니다.(MySQL 기준으로 이렇게 하면 bigint 타입이 됩니다.)
주민등록번호와 같은 비지니스상 유니크키나, 여러키를 조합한 복합키로 PK를 잡을 경우 난감한 상황이 종종 발생합니다.
(1) FK를 맺을때 다른 테이블에서 복합키 전부를 갖고 있거나, 중간 테이블을 하나더 둬야하는 상황이 발생합니다.
(2) 인덱스에 좋은 영향을 끼치지 못합니다.
(3) 유니크한 조건이 변경될 경우 PK 전체를 수정해야하는 일이 발생합니다.주민등록번호, 복합키 등은 유니크키로 별도로 추가하시는것을 추천드립니다.
즉 JPA를 사용하면 Auto_increment하는 id를 사용할 것이다. 그런데 위 ERD를 보고 든 생각은 'employee_id와 company_id를 복합키로 만든다는 건가?' 라는 생각이 든다. 즉 JPA에서 편하게 사용하라고 인조키라는 것을 일부러 줬는데 굳이 왜 저기다 FK를 엮어서 사용하냐 이말이다. 아마 ERD를 작성한 사람도 의도치 않게 사용할 수 있지만 사용할 때 잘 알고 사용해야 하고 덕분에 나도 개념을 명확히 짚을 수 있었다.
2. 문제 설명
Identifying Relationship, Non-Identifying Relationship은 한글로 식별자 관계, 비식별자 관계라고 하는데
https://rasony.tistory.com/157
위 분께서 정의를 잘 설명해 주셨다.
- 부모 엔티티가 생성된 이후 자식 엔티티가 생성될 수 있습니다
- 자식 엔티티가 부모로부터 받은 식별자만 사용하면 1:1관계
- 자식 엔티티가 부모로부터 받은 식별자와 자기 자신이 가지고있는 속성을 함께 사용하면 1:N 관계
SQLD을 딴 사람으로서 위에 말이 이해가 잘 가지 않았다. 우선, 첫 번째 문장은 이해가 갈 것이다. 대체로 엔티티는 부모, 자식관계가 뚜렷한 경우가 많고 그렇게 짜야 DB 관리자, 개발자 아니면 팀프로젝트를 하는 취준생들에게도 좋다.
두 번째 문장을 보면 '자식 엔티티가 부모로부터 받은 식별자만 사용하면 1:1관계' ??? 당연한 말인데 이렇게 써놓으니까 뭔가 어려워 보이는데,
사원 엔티티를 위와 같이 나눠야 한다고 가정하자. 원래는 사원 칼럼으로 사원 정보가 들어갈 수 있는데 가끔 DB 짜 놓은거 보면 로그인 엔티티와 사용자 정보를 나눠서 관리하는 테이블도 있다. 아무튼 사원 정보를 따로 빼면 사원 이름, 나이가 중복된 사람이 과연 없을까? 이름, 나이 어느 것도 사원 정보 엔티티를 식별하지 못한다. 따라서 사원 정보를 식별하는 PK를 사원 정보 엔티티 혼자서 정하지 못한다.
이와 같이 사원의 PK를 참조하는데 Identifying Relationship 즉 식별자 관계를 사용하면 해결된다. 즉 FK가 PK가 되고 이렇게 되면 사원 1명에 사원 정보 1개 이므로 1:1 관계가 성립한다. '자식 엔티티가 부모로부터 받은 식별자만 사용하면 1:1관계'말이 위를 말한다.
아마 JPA를 사용하는 사람은 위와 같이 생각했을 수 있다. DB에는 정답은 없고 더 좋은 DB만 있기 때문에 팀원들과 소통할 때 싸우지 말자. 어차피 여러분들이 작성한 ERD는 모두 엉터리이다. 물론 나도^^;;
세 번째 문장 '자식 엔티티가 부모로부터 받은 식별자와 자기 자신이 가지고있는 속성을 함께 사용하면 1:N 관계'라는 말은 어려운데 단순하게 생각해보면,
그냥 위 테이블이다. 굳이 설명하자면 employee_id, time를 복합키로 만들어서 교육수강 엔티티를 식별할 수 있고 이렇게 되면 1:N 관계가 성립한다. 교육수강은 시간으로만 구분 할 수 없고 교육 수강과 수강 시간을 복합키로 만들면 식별도 가능하고 사원이 여러 강의를 들었을 때 1:N도 만족한다.
[결론] : ERDcloud 잘 사용하고, 남의 것이 이해가 안되는 것은 나도 이해를 못하고 있을 경우가 많다. 따라서 모르면 외워
'DB' 카테고리의 다른 글
[DB] 와디즈 - 사용자 역할별 데이터 처리 방법, 사용자에게 권한이 여러개 기본 설정 되어 있을 때 (0) | 2024.10.29 |
---|---|
[Oracle] 테이블, 뷰, 프로시저, 함수 전체 삭제하기 (0) | 2024.10.27 |