DB ERD
๐ฏ ๋ชฉํ
"ํ๋ฃจ ํ ๋ฌธ์ , ์ปค๋ฆฌ์ด๋ฅผ ๋ฐ๊พธ๋ค โ AI ๊ธฐ๋ฐ ๊ธฐ์ ๋ฉด์ ํ๋ จ ํ๋ซํผ"
๐๏ธ ๋ฐ์ดํฐ ๋ชจ๋ธ / ERD ์ค๊ณ ๊ฐ์
1. ๐ users
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
์ฌ์ฉ์ ์๋ณ์ |
email |
VARCHAR |
์ด๋ฉ์ผ (OAuth ์ธ์ฆ ๊ธฐ๋ฐ) |
nickname |
VARCHAR |
๋๋ค์ |
profile_image_url |
TEXT |
ํ๋กํ ์ด๋ฏธ์ง URL |
created_at |
TIMESTAMP |
๊ฐ์
์ผ |
2. โ questions
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
์ง๋ฌธ ID |
content |
TEXT |
์ง๋ฌธ ๋ณธ๋ฌธ |
tags |
TEXT[] |
ํ๊ทธ ๋ฆฌ์คํธ (ex. ["Java", "๋ฐฑ์๋", "์ค"] ) |
difficulty |
VARCHAR |
๋์ด๋ (์/์ค/ํ) |
source |
VARCHAR |
์์ฑ ์ถ์ฒ (AI/๊ด๋ฆฌ์) |
created_at |
TIMESTAMP |
๋ฑ๋ก์ผ |
3. โ๏ธ answers
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
๋ต๋ณ ID |
user_id |
UUID (FK) |
์์ฑ์ |
question_id |
UUID (FK) |
์ ์ง๋ฌธ |
content |
TEXT |
์ฌ์ฉ์์ ๋ต๋ณ |
created_at |
TIMESTAMP |
์์ฑ์ผ |
4. ๐ค ai_feedback
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
ํผ๋๋ฐฑ ID |
answer_id |
UUID (FK) |
๋์ ๋ต๋ณ |
logical_score |
INT |
๋
ผ๋ฆฌ์ฑ ์ ์ (0~100) |
structure_score |
INT |
๊ตฌ์กฐ ์ ์ |
detail_score |
INT |
๊ตฌ์ฒด์ฑ/์ค๋ฌด์ฐ๊ฒฐ |
comment |
TEXT |
AI ์ข
ํฉ ํผ๋๋ฐฑ ์ฝ๋ฉํธ |
5. ๐ง follow_up_questions
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
๊ผฌ๋ฆฌ ์ง๋ฌธ ID |
answer_id |
UUID (FK) |
์์๋ ์ ๋ต๋ณ |
step |
INT |
1~3๋จ๊ณ ์ค ๋ช ๋ฒ์งธ ๊ผฌ๋ฆฌ์ง๋ฌธ์ธ์ง |
question_text |
TEXT |
AI๊ฐ ์์ฑํ ๊ผฌ๋ฆฌ ์ง๋ฌธ |
created_at |
TIMESTAMP |
์์ฑ์ผ |
6. ๐ฌ comments
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
๋๊ธ ID |
user_id |
UUID (FK) |
๋๊ธ ์์ฑ์ |
answer_id |
UUID (FK) |
๋ต๋ณ ๋์ |
content |
TEXT |
๋๊ธ ๋ด์ฉ |
created_at |
TIMESTAMP |
์์ฑ์ผ |
7. โค๏ธ likes
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
์ข์์ ID |
user_id |
UUID (FK) |
๋๋ฅธ ์ ์ |
answer_id |
UUID (FK) |
๋์ ๋ต๋ณ |
created_at |
TIMESTAMP |
๋ ์ง |
8. ๐ remixes
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
๋ฆฌ๋ฏน์ค ID |
original_answer_id |
UUID (FK) |
์๋ณธ ๋ต๋ณ |
user_id |
UUID (FK) |
๋ฆฌ๋ฏน์คํ ์ฌ๋ |
content |
TEXT |
์๋กญ๊ฒ ์์ฑํ ๋ต๋ณ ๋ด์ฉ |
created_at |
TIMESTAMP |
์์ฑ์ผ |
9. ๐น shortform_contents
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
์ฝํ
์ธ ID |
title |
VARCHAR |
์์ ์ ๋ชฉ |
url |
TEXT |
์์ URL (S3 or ์ธ๋ถ ๋งํฌ) |
tags |
TEXT[] |
ํ๊ทธ ๋ฆฌ์คํธ |
created_by |
VARCHAR |
AI / ๊ด๋ฆฌ์ ๊ตฌ๋ถ |
created_at |
TIMESTAMP |
๋ฑ๋ก์ผ |
10. ๐ bookmarks
์ปฌ๋ผ |
ํ์
|
์ค๋ช
|
id |
UUID |
์ฐ ID |
user_id |
UUID (FK) |
์ฌ์ฉ์ |
question_id |
UUID (FK) |
์ฐํ ์ง๋ฌธ |
created_at |
TIMESTAMP |
๋ ์ง |
๐ฏ ๋ชฉํ
"ํ๋ฃจ ํ ๋ฌธ์ , ์ปค๋ฆฌ์ด๋ฅผ ๋ฐ๊พธ๋ค โ AI ๊ธฐ๋ฐ ๊ธฐ์ ๋ฉด์ ํ๋ จ ํ๋ซํผ"
๐๏ธ ๋ฐ์ดํฐ ๋ชจ๋ธ / ERD DDL ์ ์ (PostgreSQL)
CREATE TABLE users (
id UUID PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
nickname VARCHAR(100) NOT NULL,
profile_image_url TEXT,
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE questions (
id UUID PRIMARY KEY,
content TEXT NOT NULL,
tags TEXT[],
difficulty VARCHAR(10),
source VARCHAR(50),
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE answers (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
question_id UUID REFERENCES questions(id),
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE ai_feedback (
id UUID PRIMARY KEY,
answer_id UUID REFERENCES answers(id),
logical_score INT,
structure_score INT,
detail_score INT,
comment TEXT
);
CREATE TABLE follow_up_questions (
id UUID PRIMARY KEY,
answer_id UUID REFERENCES answers(id),
step INT CHECK (step >= 1 AND step <= 3),
question_text TEXT NOT NULL,
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE comments (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
answer_id UUID REFERENCES answers(id),
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE likes (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
answer_id UUID REFERENCES answers(id),
created_at TIMESTAMP DEFAULT now(),
UNIQUE (user_id, answer_id)
);
CREATE TABLE remixes (
id UUID PRIMARY KEY,
original_answer_id UUID REFERENCES answers(id),
user_id UUID REFERENCES users(id),
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE shortform_contents (
id UUID PRIMARY KEY,
title VARCHAR(255) NOT NULL,
url TEXT NOT NULL,
tags TEXT[],
created_by VARCHAR(50),
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE bookmarks (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
question_id UUID REFERENCES questions(id),
created_at TIMESTAMP DEFAULT now(),
UNIQUE (user_id, question_id)
);