DB ERD - polynomeer/preptide GitHub Wiki

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)
);