
일친 시스템의 ERD를 설계해보았다. 쇠뿔도 단김에 빼라고 기획을 하니 ERD도 금방금방 나온거같다. 평소엔 좀 더 딥하고 큰 범위로 ERD를 설계했는데 이번 프로젝트의 목표 기한은 길어야 한달, 웬만하면 2주로 끝내고싶기에 최대한 간단하게 기획했다.
User (회원)id : BIGINT (PK)username : VARCHARemail : VARCHARpassword : VARCHARrole : VARCHARcreated_at : DATETIMEUser_Profile (유저 프로필)id : BIGINT (PK)user_id : BIGINT (FK, User)department_id : BIGINT (FK, Department)full_name : VARCHARphone : VARCHARDepartment (부서)id : BIGINT (PK)name : VARCHARdescription : TEXTuser_id : BIGINT (FK, User, 부서장)tel : VARCHARProject (프로젝트)id : BIGINT (PK)owner_id : BIGINT (FK, User)name : VARCHARdescription : TEXTwebhook : TEXTcreated_at : DATETIMEstate : VARCHARProject_Member (프로젝트 멤버)id : BIGINT (PK)project_id : BIGINT (FK, Project)user_id : BIGINT (FK, User)role : VARCHARjoined_at : DATETIMETask (업무 태스크)id : BIGINT (PK)project_id : BIGINT (FK, Project)assignee_id : BIGINT (FK, User)title : VARCHARdescription : TEXTstate : VARCHARdue_date : DATEcreated_at : DATETIMEIssue (이슈)id : BIGINT (PK)project_id : BIGINT (FK, Project)reporter_id : BIGINT (FK, User)task_id : BIGINT (FK, Task)pr_id : BIGINT (FK, Pull_Request)state : VARCHARtitle : VARCHARdescription : TEXTcreated_at : DATETIMEupdated_at : DATETIMEPull_Request (PR)id : BIGINT (PK)project_id : BIGINT (FK, Project)title : VARCHARurl : VARCHARstatus : VARCHARcreator_login : VARCHARcreated_at : DATETIMEComment (댓글)id : BIGINT (PK)content : TEXTtarget : VARCHAR — 댓글 또는 이슈, 태스크 대상 구분target_id : BIGINT — 대상 엔티티 IDcreated_at : DATETIMEuser_id : BIGINT (FK, User)User ↔ User_Profile : 일대일 관계
User ↔ Project : 프로젝트 소유자 (1:N)
Project ↔ Project_Member : 다대일 관계 (프로젝트별 여러 멤버)
User ↔ Project_Member : 다대일 (회원이 여러 프로젝...)
Project ↔ Task : 일대다
User (assignee) ↔ Task : 일대다
User (reporter) ↔ Issue : 일대다
Project ↔ Issue : 일대다
Issue ↔ Pull_Request : 일대일 또는 다대일 (ID 연동)
Comment ↔ 대상 (이슈, 태스크, 댓글 등) : polymorphic 형태로 대상 ID와 구분해서 저장
유연성과 확장성 중심의 설계
FK 제약 최소화 및 자바 엔티티 중심 설계
폴리모픽 연관 관계 고려
외부 시스템 연동 및 연관 정보 관리
creator_login과 같이 문자열로 저장하는 방식을 선택했다 실제 유저 테이블에 저장되지 않는 정보기 때문에 문자열로 그때그때 보여주는게 나아보여서? 채택한 방식PR 캐싱 전략과 데이터 일관성