HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
♥️
2기 최종 프로젝트 팀별 공간
/
🌳
[팀 05] Forest
/
🏗️
ERD 설계
🏗️

ERD 설계

주요 도메인

주요 도메인사용자(User)라이딩(매칭 대상)연결 테이블ERD

사용자(User)

  • 신뢰도
    • 매너 등급(점수로 보관)
  • 프로필
    • 주 활동 지역 Could
    • 경력/실력 Must
      • N년차
      • 참여 횟수
      • 라이딩 총 거리
      • 초/중/고
User
이름
자료형
Collection
필수
제약
비고
id
Long
None
필수
PK
nickname
String
None
필수
Unique, length
profile
Embedded
None
필수
Rider로서 갖는 정보들
profileImage
Entity
None
Optional
FK
1:1 연관관계 엔티티(User가 관리), 사진 없을 경우 카카오 프로필 이미지, 그것도 없다면 기본 사진을 보여주게 함
Contact
Embedded
None
Optional
인스턴스의 필수 필드로 초기화는 이루어지지만, 안에 값을 넣느냐는 나중에 선택할 수 있게 만들기
introduction
String
None
Optional
length
자기소개
Manner
Embedded
None
필수
매너 관련 클래스
RiderProfile
이름
자료형
Collection
필수
제약
비고
ridingYear
Embedded
None
필수
Year 타입으로 받을 것인지, LocalDate형태로 받을 것인지 고민, Embedded 타입으로 받아서 몇년차인지 자동으로 계산해주면 사용자 편의성 도움
level
Enum
None
필수
실력 수준을 정해진 enum값으로 입력
Bicycles
Entity
List
Optional
N:M 연관관계, 값 타입 컬렉션 방식을 피하기 위함
Ridings
Entity
List
Optional
FK
N:M 연관관계 중간 테이블 필요, 메서드를 이용해서 전체 라이딩 횟수, 총 거리 제공 User에 둘지 여기에 둘지를 고민
Manner
이름
자료형
Collection
필수
제약
비고
point
Short
None
필수
매너 점수, 해당 점수 기반으로 매너 레벨을 표시
noShow
Short
None
필수
노쇼 횟수
banned
LocalDate
None
Optional
null일 경우 ban 상태 아님
Contact
이름
자료형
Collection
필수
제약
비고
email
Embedded
None
Optional
이메일 데이터
phoneNumber
Embedded
None
Optional
전화번호 데이터
Bicycle
이름
자료형
Collection
필수
제약
비고
id
Long
None
필수
PK
Type
Enum
None
필수
종류
name
String
None
필수
length
 
 

라이딩(매칭 대상)

RidingPost
이름
자료형
Collection
필수
제약
비고
id
Long
None
필수
PK
title
String
None
필수
length
contents
String
None
필수
length
ridingImages
Entity
List
Optional
1:N 연관관계 엔티티
state
Enum
None
필수
Condition
Embedded
None
Optional
라이딩 참여 조건, Information이라고 할 수도 있겠음, 승인절차를 어떻게 설정하냐에 따른 네이밍
host
Entity
None
필수
FK
Riding을 주최한 사용자, N:1 연관관계
Route
Embedded
None
필수
경로 정보, 값 타입으로 다룰지, 엔티티로 다룰지 고민
Comments
Entity
List
Optional
FK
1:N 연관관계
Paticipants
Entity
List
필수
FK
N:M 연관관계(User)
participantCount
Int
None
필수
Condition
이름
자료형
Collection
필수
제약
비고
Bycycles
Entity
List
Optional
단일도 가능
level
Enum
None
Optional
User 도메인과 상동
ridingYear
Embedded
None
Optional
User 도메인과 상동
Route
이름
자료형
Collection
필수
제약
비고
Start
Embedded
None
Optional
둘 중 최소 하나는 있어야 함
장소 혹은 좌표를 나타내는 임베디드 타입을 이용
End
Embedded
None
Optional
RidingPostComment
이름
자료형
Collection
필수
제약
비고
id
Long
None
필수
PK
post
Entity
None
필수
FK
N:1 연관관계
author
Entity
None
필수
FK
댓글 작성 User, N:1 연관관계
contents
String
None
필수
length
댓글 내용
parent
Entity
None
Optional
FK
Self 연관관계 N:1

연결 테이블

RidingParticipate
이름
자료형
Collection
필수
제약
비고
id
Long
None
필수
PK
participantId
Entity
None
필수
FK
N:1 연관관계, User
author
Entity
None
필수
FK
N:1 연관관계, Riding
attendance
boolean
None
필수

ERD

  • Embedded Type의 경우 해당 엔티티 내에 표기 + 다이어그램에 연결해서 내부 설명
    • 단, 값을 하나만 가지는 EmbeddedType은 간단하게 필드 값을 꺼내서 엔티티에 표기했음(Age → birthDate)
 
erDiagram BaseTimeEntity { LocalDateTime createdAt LocalDateTime updatedAt } BaseImageEntity { String url String originalFileName } User { Long id String nickname LocalDate birthDate RiderProfile profile Sex sex Contact contact String introduction Short mannerPoint Long imageId } User ||--|| Contact : has Contact { Email email PhoneNumber phoneNumber } User ||--|| RiderProfile : has RiderProfile { Year ridingYear Level level } User |o--|| ProfileImage: has ProfileImage{ Long id String url String originalFileName } User |o--|{ RidingParticipate : participate RidingParticipate { Long id Long paticipantId Long ridingId boolean attendance } RidingPost ||--|{ RidingParticipate : hosts User ||--|{RidingPost : hosts RidingPost { Long id String title String contents State state Condition condition Long hostId } RidingPost ||--o{ RidingImages : has RidingImages { Long id String url String originalFileName } RidingPost ||--|| Condition : has Condition { Level level Year ridingYear } Route ||--|| RidingPost : has Route { Space start Space end } RidingPostComment }o--||RidingPost : has User ||--o{ RidingPostComment :write RidingPostComment { Long id Long postId Long authorId String contents } RiderProfile ||--o{ UserBycycle : has RidingConditionBycycle }o--|| Condition : has Bycycle { Long id Type type String name } UserBycycle }o--||Bycycle : connect UserBycycle { Long id Long userId Long bycycleId } RidingConditionBycycle }o--|| Bycycle : connect RidingConditionBycycle { Long id Long ridingPostId Long bycycleId }