일친 시스템의 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 캐싱 전략과 데이터 일관성