Entity Relationship Diagram - hyeonwoody/hyeonworld GitHub Wiki
erDiagram
user{
bigint id PK "์ ์ id"
bool login UK "๋ก๊ทธ์ธ ์ฌ๋ถ"
string(20) name UK "์ฑํจ"
int relation UK "์ด์"
int party_type UK "๊ฐ์กฑ ๊ด๊ณ"
string email "์ด๋ฉ์ผ"
bool proposition "์ฑํจ ์ฃผ๊ฒฉ์กฐ์ฌ 0 : ์ ์ด, 1 : ๋ ๊ฐ"
string nick_name "์ ์นญ"
bool nick_name_proposition "์ ์นญ ์ฃผ๊ฒฉ์กฐ์ฌ"
bool in_game "๊ฒ์ ์ฐธ๊ฐ ์ฌ๋ถ"
}
party{
bigint id PK "ํํฐ id"
int party_type "๊ฐ์กฑ ๊ด๊ณ"
datetime created_at "์์ฑ ์๊ฐ"
}
party_dashboard{
bigint party_id FK "ํํฐ id"
bigint current_game_id FK "ํ์ฌ ๊ฒ์"
int current_game_stage "ํ์ฌ ๊ฒ์ ๋จ๊ณ"
}
game{
bigint id PK "๊ฒ์ id"
string name "๊ฒ์ ์ด๋ฆ"
string description "๊ฒ์ ์ค๋ช
"
bool playable "ํ๋ ์ด ๊ฐ๋ฅ ์ฌ๋ถ"
}
round{
bigint party_id FK "ํํฐ id"
bigint id PK "๋ผ์ด๋ id"
bigint game_id FK "๊ฒ์ id"
int answer "์ ๋ต"
datetime created_at "์์ฑ ์๊ฐ"
}
submission{
bigint id PK "์ ์ถ id"
bigint round_id UK "๋ผ์ด๋ id"
bigint user_id FK "์ ์ id"
bigint number "์ซ์"
string text "๊ธ์"
}
score{
bigint party_id FK "ํํฐ id ๋ณตํฉํค"
bigint user_id FK "์ ์ id ๋ณตํฉํค"
bigint score "์ข
ํฉ ์ ์"
}
score_history{
bigint user_id FK "์ ์ id"
bigint party_id FK "ํํฐ id"
bigint round_id FK "๋ผ์ด๋ id"
bigint score "๋ผ์ด๋ ๋ณ ํ๋ ์ ์"
}
party ||--|| party_dashboard : contains
party_dashboard ||--|| game : "tracks current"
party ||--o{ round : includes
user ||--o{ submission : submits
round ||--o{ submission : "is accosiated with"
round ||--o{ score_history : generates
score ||--o{ score_history : "is detailed in"
game ||--|| round : "plays in"
ERD ๊ตฌ์กฐ
user
: ์ฌ์ฉ์ ์ ๋ณด
party
: ๊ฒ์ ํํฐ ์ ๋ณด
party_dashboard
: ํ์ฌ ํํฐ ์ํ
round
: ๊ฒ์ ๋ผ์ด๋ ์ ๋ณด
game
: ๊ฒ์ ์ ๋ณด
submission
: ์ฌ์ฉ์ ์ ์ถ ์ ๋ณด
score
: ์ฌ์ฉ์ ์ ์
score_history
: ๋ผ์ด๋๋ณ ์ ์ ๊ธฐ๋ก
์ฃผ์ ๊ด๊ณ
user
- user์ submission: 1:N ๊ด๊ณ ("submits")
party
- party์ party_dashboard: 1:1 ๊ด๊ณ ("contains")
- party์ round: 1:N ๊ด๊ณ ("includes")
round
- round์ submission: 1:N ๊ด๊ณ ("is associated with")
- round์ score_history: 1:N ๊ด๊ณ ("generates")
game
- game๊ณผ round: 1:1 ๊ด๊ณ ("plays in")
- party_dashboard์ game: 1:1 ๊ด๊ณ ("tracks current")
๋ ผ๋ฆฌ์ ์ธ๋ํค
MSA๋ก์ ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ๋๋ฉ์ธ ๊ฐ ๊ฒฐํฉ์ ์ค์ด๊ธฐ ์ํด
๋
ผ๋ฆฌ์ ์ธ๋ํค๋ง ์ฌ์ฉํ๊ณ ๋ฌผ๋ฆฌ์ ์ธ๋ํค๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ฅ์ :
์๋น์ค ์์จ์ฑ ์ฆ๊ฐ: ๊ฐ ์๋น์ค๊ฐ ์์ฒด ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์์ ํ ์ ์ดํ ์ ์์ต๋๋ค.
๋ฐฐํฌ ์ฉ์ด์ฑ: ์๋น์ค ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข
์์ฑ์ด ์ค์ด ๋
๋ฆฝ์ ์ธ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ฑ๋ฅ ์ต์ ํ: ๊ฐ ์๋น์ค์ ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ์ ์ ํ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋จ์ :
๋ฐ์ดํฐ ์ผ๊ด์ฑ ๊ด๋ฆฌ ๋ณต์ก: ์๋น์ค ๊ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ผ๋ก ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
์ฟผ๋ฆฌ ๋ณต์ก์ฑ ์ฆ๊ฐ: ์ฌ๋ฌ ์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ์ค๋ณต: ์ผ๋ถ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ์๋น์ค์ ์ค๋ณต ์ ์ฅ๋ ์ ์์ต๋๋ค.
score ๋ณตํฉํค
์ธ๋ํค๊ฐ ์๋ ์ด์
- MSA ์์น ์ค์:
๋ ผ๋ฆฌ์ ์ธ๋ ํค ์ฌ์ฉ์ผ๋ก ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ๋ ๋ฆฝ์ฑ์ ์ ์งํฉ๋๋ค.
UNIQUE๊ฐ ์๋ ์ด์
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ:
๋ณตํฉํค๋ NULL๊ฐ์ ํ์ฉํ์ง ์๊ณ UNIQUE๋ NULL๊ฐ์ ํ์ฉํ๋๋ฐ
party_id
์user_id
๋ ํญ์ ์กด์ฌํ๋ฏ๋ก ๋ณตํฉํค๋ก ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. - ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค
๋ณตํฉํค๋ ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๊ฐ ์์ฑ๋๊ณ
UNIQUE๋ ๋นํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๊ฐ ์์ฑ ๋ฉ๋๋ค.
ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๋ ๋ฒ์ ๊ฒ์๊ณผ ์ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์์ผ๋ฉฐ
์ด๋ ํน์ ํํฐ ๋ด์ ๋ชจ๋ ์ฌ์ฉ์ ์ ์๋ฅผ ์กฐํํ๋ ์์ ์์ ์ฑ๋ฅ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. - ์ ์ฅ ๊ณต๊ฐ ํจ์จ์ฑ:
ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ ์์ฒด๋ฅผ ์ธ๋ฑ์ค ์์๋๋ก ์ ์ฅํ๋ฏ๋ก,
๋ณ๋์ ์ธ๋ฑ์ค ๊ตฌ์กฐ๊ฐ ํ์ ์์ด ์ ์ฅ ๊ณต๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค. - ์กฐ์ธ ์ฑ๋ฅ:
ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๋ ์๋ณ ๊ด๊ณ์์ ์กฐ์ธ ์ฑ๋ฅ์ด ์ฐ์ํฉ๋๋ค. - ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ช
ํ์ฑ:
party_id
์user_id
์ ์กฐํฉ์ด ํต์ฌ ์๋ณ์์์ ๋ช ์ํ๋ฉฐ
๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ดํดํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ์ ๋์์ด ๋ฉ๋๋ค.
score ๊ด๊ณ
user
์ score
๊ฐ์ 1:N ๊ด๊ณ๋ฅผ ๋ฃ์ง ์์ ์ด์
- ๋ค์ค ๊ด๊ณ ๋ฐฉ์ง:
user
์score
์ฌ์ด์ ์ง์ ์ ์ธ 1:๋ค ๊ด๊ณ๋ฅผ ํํํ๋ฉด, party์์ ๊ด๊ณ๊ฐ ๋ชจํธํด์ง ์ ์์ต๋๋ค.
ํ์ฌ ๊ตฌ์กฐ๋ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ํํฐ์ ์ฐธ์ฌํ ์ ์๊ณ , ๊ฐ ํํฐ๋ง๋ค ๋ณ๋์ ์ ์๋ฅผ ๊ฐ์ง ์ ์์์ ๋ช ํํ ํฉ๋๋ค. - ERD์ ๊ฐ๊ฒฐ์ฑ:
ํ์ฌ ๊ตฌ์กฐ๋ ํ์์ ์ธ ๊ด๊ณ๋ง์ ํํํ์ฌ ERD์ ๊ฐ๋ ์ฑ์ ์ ์งํ๊ณ ์์ต๋๋ค.
๋ชจ๋ ๊ด๊ณ๋ฅผ ๋ช ์์ ์ผ๋ก ํํํ๋ฉด ๋ค์ด์ด๊ทธ๋จ์ด ๋ณต์กํด์ง ์ ์์ต๋๋ค.