실무에서 ERD를 설계하고 개발했던 경험을 바탕으로 ERD 설계 방법에 대해 간단하게 정리하는 시간을 가져보겠습니다.
ERD와 엔티티(Entity)
ERD(Entity Relationship Diagram)는 엔티티 간의 관계를 그림으로 나타낸 것입니다.
엔티티란 개발자가 DB에 저장해서 관리하는 객체입니다. 저장된 객체를 식별하려면 각각을 식별할 수 있는 식별자가 있어야 합니다. 그래서 엔티티는 중복되지 않는 ID를 필수적으로 부여 받습니다. 엔티티의 상태 값(이름, 나이 등)은 동일하더라도 ID를 비교하여 다른 엔티티임을 확인할 수 있습니다.
stack overflow에 ERD와 UML에 대해 잘 정리된 답글이 있어 공유합니다.
Is ERD considered a kind of UML diagram? (👈click!!)
연관 관계 나타내는 방법
엔티티는 RDB의 테이블에 저장할 수 있습니다. 테이블 사이에서 엔티티의 ID를 외래키로 지정하면서 엔티티 사이의 연관 관계가 만들어집니다. 가장 핵심적인 두 가지 연관 관계를 ERD로 표현하는 방법을 정리했습니다.
ERD를 그릴 때 사용할 수 있는 툴로 draw.io를 추천합니다.
일대일 연관 관계
학생과 사물함의 관계를 일대일 연관 관계로 나타낼 수 있습니다.
학생과 사물함의 일대일 연관 관계를 ERD로 표현하는 방법은 두 가지가 있습니다.
①은 학생이 사물함의 외래키를 관리하는 주체인 경우, ②는 사물함이 학생의 외래키를 관리하는 주체인 경우를 나타냅니다. 두 가지 설계 중 개발자가 실용적으로 판단하여 더 나은 것을 선택해야 합니다.
다대일 연관 관계
학생과 강의는 다대다 연관 관계를 가집니다. 하지만 실무에서는 중간에 엔티티를 추가하여 다대다 연관 관계를 일대다, 다대일 연관 관계로 바꾸는 방식을 선호합니다. 즉, 학생과 강의 사이에 학생_강의 엔티티를 추가하고 학생과 학생_강의의 연관 관계를 일대다로, 학생_강의와 강의의 연관 관계를 다대일로 만듭니다. 학생_강의 엔티티를 통해서 학생과 연관 관계에 있는 강의에 대해서 수강 상태, 학점 등의 상태를 DB에 저장하여 관리할 수 있게 됩니다.
학생_강의와 학생 사이의 연관 관계는 학생 강의 테이블에서 학생_id를 외래키로 지정함으로써 다대일 연관 관계가 형성됩니다. 일에 해당하는 쪽에서 외래키를 관리하게 할 수도 있으나, 다에 해당하는 쪽이 외래키를 관리하는 것이 성능이나 쿼리의 복잡도 면에서 이점이 있습니다.
엔티티의 일대일, 다대일 연관 관계를 ERD로 그리는 방법을 알아보았습니다.
이외에 상속 관계를 ERD로 표현하는 방법도 있지만 상속 관계가 적용된 코드는 매우 복잡해지기 때문에 실무에서는 반드시 필요한 경우가 아니면 사용하지 않습니다. 실제로 JPA를 사용하면서 엔티티에 다형성을 적용했다가 코드가 너무 복잡해져서 다형성을 적용하지 않은 코드로 변경한 경험이 있습니다. 위에서 정리한 내용들로도 충분히 심플하고 좋은 ERD를 설계하실 수 있습니다.