database
Fitgiv MariaDB 11.8 Architecture
Fitgiv 데이터베이스 테이블 설계 명세서
Fitgiv 서비스의 모든 데이터 모델은 fit_ 프리픽스로 격리되어 관리됩니다. 건강 콘텐츠 발행, 의료진 전문 팩트체크 검증, 멀티 포맷 변환, 사용자 인터랙션 및 시스템 설정을 완벽하게 지원합니다.
DBMS / 엔진
MariaDB 11.8 / InnoDB
문자셋 / Collate
utf8mb4 / unicode_ci
테이블 프리픽스
fit_
대상 DB명 / 호스트
test @ 127.0.0.1
table_chart
총 테이블 수
12개 (fit_)
view_column
총 필드 (컬럼) 수
110개 필드
account_tree
도메인 모듈
4개 영역
sync_saved_locally
DB 동기화 상태
스키마 파일 대기
search
1. fit_users
회원 및 관리자 계정
13 Columns
info
Fitgiv 플랫폼의 관리자, 에디터, 의학 전문가, 일반 회원의 인증 및 기본 정보 관리
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | BIGINT UNSIGNED | key PK AI | NOT NULL | None | 사용자 고유 번호 (PK) |
| 2 | user_id | VARCHAR(50) | UNIQUE | NOT NULL | None | 로그인 아이디 / 사용자명 |
| 3 | VARCHAR(100) | UNIQUE | NOT NULL | None | 이메일 주소 | |
| 4 | password | VARCHAR(255) | NULL | None | 비밀번호 해시 (OAuth 가입 시 NULL 가능) | |
| 5 | name | VARCHAR(50) | NOT NULL | None | 실명 또는 표시 이름 | |
| 6 | nickname | VARCHAR(50) | NULL | None | 활동 닉네임 | |
| 7 | avatar_url | VARCHAR(500) | NULL | None | 프로필 이미지 URL | |
| 8 | role | ENUM('admin','editor','expert','user') | NOT NULL | 'user' | 권한 등급 (admin, editor, expert, user) | |
| 9 | status | ENUM('active','inactive','suspended') | NOT NULL | 'active' | 계정 상태 (active, inactive, suspended) | |
| 10 | email_verified_at | TIMESTAMP | NULL | NULL | 이메일 인증 일시 | |
| 11 | last_login_at | TIMESTAMP | NULL | NULL | 최근 로그인 일시 | |
| 12 | created_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 가입 일시 | |
| 13 | updated_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP ON UPDATE | 정보 수정 일시 |
tune 인덱스 (5):
PRIMARY (id)
uk_fit_users_user_id (user_id)
uk_fit_users_email (email)
idx_fit_users_role (role)
idx_fit_users_status (status)
2. fit_experts
의학 검증 의료진 프로필
10 Columns
info
의학 팩트체크 검증 권한을 가진 의료진 및 전문가 프로필 (의사, 약사, 임상영양사 등)
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | BIGINT UNSIGNED | key PK AI | NOT NULL | None | 의학 전문가 고유 번호 (PK) |
| 2 | user_id | BIGINT UNSIGNED | link FK | NOT NULL | None | 회원 고유 번호 (FK) ↳ References fit_users.id |
| 3 | license_number | VARCHAR(50) | NULL | None | 의사/약사/영양사 면허 번호 | |
| 4 | specialty | VARCHAR(100) | NOT NULL | None | 전문의 진료과목 / 전문 분야 | |
| 5 | affiliation | VARCHAR(100) | NULL | None | 소속 병원 / 연구소 / 대학교 | |
| 6 | bio | TEXT | NULL | None | 전문가 약력 및 소개글 | |
| 7 | verification_badge | VARCHAR(50) | NOT NULL | '의학 검증 완료' | 노출 뱃지 명칭 | |
| 8 | is_verified | TINYINT(1) | NOT NULL | 1 | 관리자 공인 검증 여부 (1:검증완료, 0:미검증) | |
| 9 | created_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 등록 일시 | |
| 10 | updated_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP ON UPDATE | 수정 일시 |
tune 인덱스 (3):
PRIMARY (id)
uk_fit_experts_user_id (user_id)
idx_fit_experts_specialty (specialty)
3. fit_categories
메인 카테고리 분류
10 Columns
info
네비게이션 상단 대분류 (생활건강, 질병·예방, 영양·운동, 팩트체크)
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | INT UNSIGNED | key PK AI | NOT NULL | None | 카테고리 고유 번호 (PK) |
| 2 | slug | VARCHAR(50) | UNIQUE | NOT NULL | None | URL 식별자 (life, disease, exercise, factcheck) |
| 3 | name | VARCHAR(50) | NOT NULL | None | 카테고리명 | |
| 4 | description | VARCHAR(255) | NULL | None | 카테고리 설명 | |
| 5 | icon | VARCHAR(50) | NULL | None | Material Symbols 아이콘 식별자 | |
| 6 | color | VARCHAR(20) | NULL | None | 카테고리 대표 색상 코드 | |
| 7 | sort_order | INT | NOT NULL | 0 | 정렬 순서 | |
| 8 | is_active | TINYINT(1) | NOT NULL | 1 | 사용 여부 (1:사용, 0:미사용) | |
| 9 | created_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 생성 일시 | |
| 10 | updated_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP ON UPDATE | 수정 일시 |
tune 인덱스 (3):
PRIMARY (id)
uk_fit_categories_slug (slug)
idx_fit_categories_sort (sort_order, is_active)
4. fit_subcategories
서브 카테고리 및 테마 필터
8 Columns
info
서브 네비게이션 필터 (계절별 건강, 연령별 건강, 생활 상식, 자세 교정 등)
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | INT UNSIGNED | key PK AI | NOT NULL | None | 서브 카테고리 고유 번호 (PK) |
| 2 | category_id | INT UNSIGNED | link FK | NOT NULL | None | 소속 메인 카테고리 번호 (FK) ↳ References fit_categories.id |
| 3 | slug | VARCHAR(50) | NOT NULL | None | URL 식별자 (season, age, knowledge 등) | |
| 4 | name | VARCHAR(50) | NOT NULL | None | 서브 카테고리명 | |
| 5 | sort_order | INT | NOT NULL | 0 | 정렬 순서 | |
| 6 | is_active | TINYINT(1) | NOT NULL | 1 | 사용 여부 (1:사용, 0:미사용) | |
| 7 | created_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 생성 일시 | |
| 8 | updated_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP ON UPDATE | 수정 일시 |
tune 인덱스 (3):
PRIMARY (id)
idx_fit_subcat_category (category_id)
idx_fit_subcat_slug (slug)
5. fit_articles
건강 콘텐츠 및 카드뉴스 건강정보
21 Columns
info
Fitgiv 핵심 콘텐츠 본문, 카드뉴스 메타데이터, 3줄 요약, 의학 검증 뱃지 및 통계
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | BIGINT UNSIGNED | key PK AI | NOT NULL | None | 건강정보 고유 번호 (PK) |
| 2 | category_id | INT UNSIGNED | link FK | NOT NULL | None | 메인 카테고리 번호 (FK) ↳ References fit_categories.id |
| 3 | subcategory_id | INT UNSIGNED | link FK | NULL | None | 서브 카테고리 번호 (FK) ↳ References fit_subcategories.id |
| 4 | author_id | BIGINT UNSIGNED | link FK | NOT NULL | None | 작성자 회원 번호 (FK) ↳ References fit_users.id |
| 5 | title | VARCHAR(255) | NOT NULL | None | 건강정보 제목 | |
| 6 | subtitle | VARCHAR(255) | NULL | None | 부제목 또는 핵심 카피 | |
| 7 | summary | TEXT | NULL | None | 리스트 노출용 2~3줄 요약 | |
| 8 | key_points | JSON | NULL | None | 3줄 핵심 요약 리스트 (JSON Array) | |
| 9 | content_html | LONGTEXT | NULL | None | 상세 본문 HTML 내용 | |
| 10 | thumbnail_url | VARCHAR(500) | NULL | None | 대표 썸네일 / 카드 커버 이미지 URL | |
| 11 | read_time_minutes | INT UNSIGNED | NOT NULL | 3 | 예상 읽기 시간 (분 단위) | |
| 12 | is_featured | TINYINT(1) | NOT NULL | 0 | Today's Pick 추천 여부 | |
| 13 | is_fact_checked | TINYINT(1) | NOT NULL | 1 | 의학 검증 뱃지 표시 여부 | |
| 14 | status | ENUM('draft','published','archived') | NOT NULL | 'published' | 발행 상태 | |
| 15 | view_count | INT UNSIGNED | NOT NULL | 0 | 누적 조회수 | |
| 16 | like_count | INT UNSIGNED | NOT NULL | 0 | 누적 좋아요 수 | |
| 17 | bookmark_count | INT UNSIGNED | NOT NULL | 0 | 누적 북마크 수 | |
| 18 | share_count | INT UNSIGNED | NOT NULL | 0 | 누적 공유 수 | |
| 19 | published_at | TIMESTAMP | NULL | NULL | 발행 일시 | |
| 20 | created_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 작성 일시 | |
| 21 | updated_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP ON UPDATE | 수정 일시 |
tune 인덱스 (6):
PRIMARY (id)
idx_fit_articles_category (category_id)
idx_fit_articles_subcat (subcategory_id)
idx_fit_articles_author (author_id)
idx_fit_articles_status_pub (status, published_at)
idx_fit_articles_featured (is_featured)
6. fit_fact_checks
의학 전문 팩트체크 리포트
10 Columns
info
건강정보별 전문 의료진 검증 판정, 요약 가이드, 근거 학술 논문 및 출처
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | BIGINT UNSIGNED | key PK AI | NOT NULL | None | 팩트체크 리포트 번호 (PK) |
| 2 | article_id | BIGINT UNSIGNED | link FK UNIQUE | NOT NULL | None | 대상 건강정보 번호 (FK, 1:1) ↳ References fit_articles.id |
| 3 | expert_id | BIGINT UNSIGNED | link FK | NOT NULL | None | 검증 의료진 번호 (FK) ↳ References fit_experts.id |
| 4 | verdict | ENUM('verified','caution','false_claim','needs_update') | NOT NULL | 'verified' | 검증 판정 | |
| 5 | summary | TEXT | NOT NULL | None | 의학 검증 총평 및 가이드 요약 | |
| 6 | medical_points | JSON | NOT NULL | None | 의학 검증 세부 포인트 (JSON) | |
| 7 | references_citations | JSON | NULL | None | 근거 학술 논문 및 가이드라인 출처 (JSON) | |
| 8 | verified_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 검증 완료 일시 | |
| 9 | created_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 등록 일시 | |
| 10 | updated_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP ON UPDATE | 수정 일시 |
tune 인덱스 (3):
PRIMARY (id)
uk_fit_fact_checks_article (article_id)
idx_fit_fact_checks_expert (expert_id)
7. fit_content_formats
멀티 포맷 자동 변환 출력 데이터
8 Columns
info
1개 원천 데이터를 4가지 포맷(인스타 카드뉴스, 블로그, SNS 단문, 썸네일)으로 변환한 결과물 저장
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | BIGINT UNSIGNED | key PK AI | NOT NULL | None | 변환 포맷 고유 번호 (PK) |
| 2 | article_id | BIGINT UNSIGNED | link FK | NOT NULL | None | 원천 건강정보 번호 (FK) ↳ References fit_articles.id |
| 3 | format_type | ENUM('card_news','blog_post','sns_short','video_thumbnail') | NOT NULL | None | 변환 포맷 유형 | |
| 4 | title | VARCHAR(255) | NULL | None | 포맷별 최적화 타이틀 | |
| 5 | payload_data | JSON | NOT NULL | None | 포맷별 생성 데이터 (JSON) | |
| 6 | is_generated | TINYINT(1) | NOT NULL | 1 | 자동 생성 완료 여부 (1:완료, 0:대기) | |
| 7 | created_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 변환 생성 일시 | |
| 8 | updated_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP ON UPDATE | 수정 일시 |
tune 인덱스 (2):
PRIMARY (id)
idx_fit_formats_article_type (article_id, format_type)
8. fit_bookmarks
사용자 건강정보 북마크
5 Columns
info
회원 및 비로그인(세션/UUID) 사용자의 북마크 보관함
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | BIGINT UNSIGNED | key PK AI | NOT NULL | None | 북마크 고유 번호 (PK) |
| 2 | user_id | BIGINT UNSIGNED | link FK | NULL | None | 회원 번호 (FK) ↳ References fit_users.id |
| 3 | session_id | VARCHAR(100) | NULL | None | 비로그인 사용자 식별 UUID | |
| 4 | article_id | BIGINT UNSIGNED | link FK | NOT NULL | None | 건강정보 번호 (FK) ↳ References fit_articles.id |
| 5 | created_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 북마크 저장 일시 |
tune 인덱스 (4):
PRIMARY (id)
uk_fit_bookmarks_user_art (user_id, article_id)
idx_fit_bookmarks_session (session_id, article_id)
idx_fit_bookmarks_article (article_id)
9. fit_likes
건강정보 좋아요 기록
5 Columns
info
건강정보 좋아요 클릭 이력 및 중복 방지 (회원/IP 해시)
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | BIGINT UNSIGNED | key PK AI | NOT NULL | None | 좋아요 고유 번호 (PK) |
| 2 | user_id | BIGINT UNSIGNED | link FK | NULL | None | 회원 번호 (FK) ↳ References fit_users.id |
| 3 | ip_hash | VARCHAR(64) | NULL | None | 비로그인 중복 방지용 IP 해시 | |
| 4 | article_id | BIGINT UNSIGNED | link FK | NOT NULL | None | 건강정보 번호 (FK) ↳ References fit_articles.id |
| 5 | created_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 좋아요 클릭 일시 |
tune 인덱스 (4):
PRIMARY (id)
uk_fit_likes_user_art (user_id, article_id)
idx_fit_likes_ip_art (ip_hash, article_id)
idx_fit_likes_article (article_id)
10. fit_view_logs
건강정보 조회 통계 로그
7 Columns
info
방문자 디바이스(모바일/데스크톱), 유입경로, 시간대별 조회수 분석용 로그
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | BIGINT UNSIGNED | key PK AI | NOT NULL | None | 조회 로그 고유 번호 (PK) |
| 2 | article_id | BIGINT UNSIGNED | link FK | NOT NULL | None | 건강정보 번호 (FK) ↳ References fit_articles.id |
| 3 | user_id | BIGINT UNSIGNED | link FK | NULL | None | 회원 번호 (FK) ↳ References fit_users.id |
| 4 | device_type | ENUM('desktop','mobile','tablet') | NOT NULL | 'mobile' | 접속 디바이스 종류 | |
| 5 | referrer | VARCHAR(500) | NULL | None | 유입 경로 URL | |
| 6 | ip_hash | VARCHAR(64) | NULL | None | 익명화된 접속 IP 해시 | |
| 7 | viewed_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 조회 일시 |
tune 인덱스 (3):
PRIMARY (id)
idx_fit_view_logs_article (article_id)
idx_fit_view_logs_date (viewed_at)
11. fit_settings
사이트 전역 환경설정
6 Columns
info
사이트 명칭, 슬로건, 자동 변환 엔진 옵션 등 Key-Value 설정 저장
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | INT UNSIGNED | key PK AI | NOT NULL | None | 설정 고유 번호 (PK) |
| 2 | setting_key | VARCHAR(50) | UNIQUE | NOT NULL | None | 설정 키 |
| 3 | setting_value | LONGTEXT | NULL | None | 설정 값 | |
| 4 | description | VARCHAR(255) | NULL | None | 설정 항목 설명 | |
| 5 | group_name | VARCHAR(50) | NOT NULL | 'general' | 설정 그룹 분류 | |
| 6 | updated_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP ON UPDATE | 최종 수정 일시 |
tune 인덱스 (2):
PRIMARY (id)
uk_fit_settings_key (setting_key)
12. fit_versions
배포 및 버전 릴리즈 이력
7 Columns
info
version.json 및 서버 Git API 배포 버전 이력 동기화 저장
| # | 컬럼명 (Field) | 데이터 타입 | 제약조건 (Key) | Null 허용 | 기본값 (Default) | 설명 (Comment / Description) |
|---|---|---|---|---|---|---|
| 1 | id | INT UNSIGNED | key PK AI | NOT NULL | None | 버전 이력 고유 번호 (PK) |
| 2 | version_tag | VARCHAR(20) | NOT NULL | None | 버전 태그 (v 0.1, v 0.2 등) | |
| 3 | commit_hash | VARCHAR(64) | NULL | None | Git 커밋 해시 | |
| 4 | release_title | VARCHAR(255) | NOT NULL | None | 릴리즈 제목 | |
| 5 | release_notes | TEXT | NULL | None | 변경 내역 및 릴리즈 노트 | |
| 6 | deployed_by | VARCHAR(50) | NOT NULL | 'system' | 배포 실행자 | |
| 7 | deployed_at | TIMESTAMP | NOT NULL | CURRENT_TIMESTAMP | 배포 완료 일시 |
tune 인덱스 (2):
PRIMARY (id)
idx_fit_versions_tag (version_tag)
hub Fitgiv 엔티티 관계도 (Entity Relationship Diagram)
테이블 간의 1:1, 1:N 외래키 관계 및 핵심 데이터 플로우를 시각화합니다.
콘텐츠 모듈
검증/회원 모듈
인터랙션 모듈
시스템 모듈
verified_user 회원 & 의학 검증단
fit_users
Core User
- 🔑 id (PK)
- user_id (UQ)
- email (UQ)
- role (admin/expert/user)
- name, nickname
fit_experts
Profile
- 🔑 id (PK)
- 🔗 user_id (FK)
- license_number
- specialty, affiliation
- verification_badge
category 카테고리 & 필터
fit_categories
Main Nav
- 🔑 id (PK)
- slug (life/disease/...)
- name, icon, color
- sort_order, is_active
fit_subcategories
Sub Filter
- 🔑 id (PK)
- 🔗 category_id (FK)
- slug (season/age/...)
- name, sort_order
article 콘텐츠 & 팩트체크
fit_articles
Main Content
- 🔑 id (PK)
- 🔗 category_id (FK)
- 🔗 subcategory_id (FK)
- 🔗 author_id (FK)
- title, summary
- key_points (3줄요약 JSON)
- thumbnail_url, read_time
- is_fact_checked, is_featured
fit_fact_checks
1:1 Review
- 🔑 id (PK)
- 🔗 article_id (FK, UQ)
- 🔗 expert_id (FK)
- verdict (verified/caution)
- medical_points (JSON)
- references_citations (JSON)
fit_content_formats
Multi 4-Format
- 🔑 id (PK)
- 🔗 article_id (FK)
- format_type (card/blog/sns/thumb)
- payload_data (JSON)
touch_app 반응, 통계 & 시스템
fit_bookmarks / likes
Action
- 🔑 id (PK)
- 🔗 user_id / session_id
- 🔗 article_id (FK)
- created_at
fit_view_logs
Analytics
- 🔑 id (PK)
- 🔗 article_id (FK)
- device_type, referrer
- viewed_at
fit_settings / versions
Config
- setting_key, setting_value
- version_tag, commit_hash
- release_notes, deployed_at
terminal MariaDB 11.8 / MySQL 8.0+ DDL 스크립트
UTF8MB4 인코딩, InnoDB 엔진, 외래키 제약조건 및 초기 시드 데이터가 포함되어 있습니다.
db/schema.sql
12 Tables • InnoDB • utf8mb4_unicode_ci
-- ==============================================================================
-- Fitgiv Database Schema Definition (MariaDB 11.8 / MySQL 8.0+)
-- Prefix: fit_ (전체 테이블 프리픽스)
-- Target Database: test (or custom)
-- Charset: utf8mb4 / Collation: utf8mb4_unicode_ci
-- ==============================================================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ------------------------------------------------------------------------------
-- 1. fit_users : 회원 및 관리자, 에디터 계정 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_users`;
CREATE TABLE `fit_users` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '사용자 고유 번호 (PK)',
`user_id` VARCHAR(50) NOT NULL COMMENT '로그인 아이디 / 사용자명',
`email` VARCHAR(100) NOT NULL COMMENT '이메일 주소',
`password` VARCHAR(255) NULL COMMENT '비밀번호 해시 (OAuth 가입 시 NULL 가능)',
`name` VARCHAR(50) NOT NULL COMMENT '실명 또는 표시 이름',
`nickname` VARCHAR(50) NULL COMMENT '활동 닉네임',
`avatar_url` VARCHAR(500) NULL COMMENT '프로필 이미지 URL',
`role` ENUM('admin', 'editor', 'expert', 'user') NOT NULL DEFAULT 'user' COMMENT '권한 등급 (admin:최고관리자, editor:콘텐츠작성자, expert:의학검증자, user:일반회원)',
`status` ENUM('active', 'inactive', 'suspended') NOT NULL DEFAULT 'active' COMMENT '계정 상태 (active:활성, inactive:비활성, suspended:정지)',
`email_verified_at` TIMESTAMP NULL DEFAULT NULL COMMENT '이메일 인증 일시',
`last_login_at` TIMESTAMP NULL DEFAULT NULL COMMENT '최근 로그인 일시',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '가입 일시',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '정보 수정 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_fit_users_user_id` (`user_id`),
UNIQUE KEY `uk_fit_users_email` (`email`),
KEY `idx_fit_users_role` (`role`),
KEY `idx_fit_users_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='회원 및 관리자 계정';
-- ------------------------------------------------------------------------------
-- 2. fit_experts : 의학 검증 전문 의료진 프로필 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_experts`;
CREATE TABLE `fit_experts` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '의학 전문가 고유 번호 (PK)',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '회원 고유 번호 (FK -> fit_users.id)',
`license_number` VARCHAR(50) NULL COMMENT '의사/약사/영양사 면허 번호',
`specialty` VARCHAR(100) NOT NULL COMMENT '전문의 진료과목 / 전문 분야 (예: 가정의학과, 내과, 임상영양학)',
`affiliation` VARCHAR(100) NULL COMMENT '소속 병원 / 연구소 / 대학교',
`bio` TEXT NULL COMMENT '전문가 약력 및 소개글',
`verification_badge` VARCHAR(50) NOT NULL DEFAULT '의학 검증 완료' COMMENT '노출 뱃지 명칭',
`is_verified` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '관리자 공인 검증 여부 (1:검증완료, 0:미검증)',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록 일시',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_fit_experts_user_id` (`user_id`),
KEY `idx_fit_experts_specialty` (`specialty`),
CONSTRAINT `fk_fit_experts_user` FOREIGN KEY (`user_id`) REFERENCES `fit_users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='의학 검증 의료진 프로필';
-- ------------------------------------------------------------------------------
-- 3. fit_categories : 메인 대분류 카테고리 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_categories`;
CREATE TABLE `fit_categories` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '카테고리 고유 번호 (PK)',
`slug` VARCHAR(50) NOT NULL COMMENT 'URL 식별자 (예: life, disease, exercise, factcheck)',
`name` VARCHAR(50) NOT NULL COMMENT '카테고리명 (예: 생활건강, 질병·예방, 영양·운동, 팩트체크)',
`description` VARCHAR(255) NULL COMMENT '카테고리 설명',
`icon` VARCHAR(50) NULL COMMENT 'Material Symbols 아이콘 식별자',
`color` VARCHAR(20) NULL COMMENT '카테고리 대표 색상 코드',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '정렬 순서',
`is_active` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '사용 여부 (1:사용, 0:미사용)',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_fit_categories_slug` (`slug`),
KEY `idx_fit_categories_sort` (`sort_order`, `is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='메인 카테고리 분류';
-- ------------------------------------------------------------------------------
-- 4. fit_subcategories : 서브메뉴 소분류 및 테마 필터 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_subcategories`;
CREATE TABLE `fit_subcategories` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '서브 카테고리 고유 번호 (PK)',
`category_id` INT UNSIGNED NOT NULL COMMENT '소속 메인 카테고리 번호 (FK -> fit_categories.id)',
`slug` VARCHAR(50) NOT NULL COMMENT 'URL 식별자 (예: season, age, knowledge, stress, food, posture)',
`name` VARCHAR(50) NOT NULL COMMENT '서브 카테고리명 (예: 계절별 건강, 연령별 건강, 생활 상식, 자세 교정)',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '정렬 순서',
`is_active` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '사용 여부 (1:사용, 0:미사용)',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (`id`),
KEY `idx_fit_subcat_category` (`category_id`),
KEY `idx_fit_subcat_slug` (`slug`),
CONSTRAINT `fk_fit_subcat_category` FOREIGN KEY (`category_id`) REFERENCES `fit_categories` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='서브 카테고리 및 테마 필터';
-- ------------------------------------------------------------------------------
-- 5. fit_articles : 건강 콘텐츠 및 카드뉴스 아티클 본문 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_articles`;
CREATE TABLE `fit_articles` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '아티클 고유 번호 (PK)',
`category_id` INT UNSIGNED NOT NULL COMMENT '메인 카테고리 번호 (FK -> fit_categories.id)',
`subcategory_id` INT UNSIGNED NULL COMMENT '서브 카테고리 번호 (FK -> fit_subcategories.id)',
`author_id` BIGINT UNSIGNED NOT NULL COMMENT '작성자 회원 번호 (FK -> fit_users.id)',
`title` VARCHAR(255) NOT NULL COMMENT '아티클 제목',
`subtitle` VARCHAR(255) NULL COMMENT '부제목 또는 핵심 카피',
`summary` TEXT NULL COMMENT '리스트 노출용 2~3줄 요약',
`key_points` JSON NULL COMMENT '3줄 핵심 요약 리스트 (JSON Array: ["1. ...", "2. ...", "3. ..."])',
`content_html` LONGTEXT NULL COMMENT '상세 본문 HTML 내용',
`thumbnail_url` VARCHAR(500) NULL COMMENT '대표 썸네일 / 카드 커버 이미지 URL',
`read_time_minutes` INT UNSIGNED NOT NULL DEFAULT 3 COMMENT '예상 읽기 시간 (분 단위, 예: 1, 3, 5)',
`is_featured` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Today''s Pick 또는 메인 추천 여부 (1:추천, 0:일반)',
`is_fact_checked` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '의학 검증 뱃지 표시 여부 (1:검증됨, 0:미검증)',
`status` ENUM('draft', 'published', 'archived') NOT NULL DEFAULT 'published' COMMENT '발행 상태 (draft:임시저장, published:발행, archived:보관)',
`view_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '누적 조회수',
`like_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '누적 좋아요 수',
`bookmark_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '누적 북마크 수',
`share_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '누적 공유 수',
`published_at` TIMESTAMP NULL DEFAULT NULL COMMENT '발행 일시',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '작성 일시',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (`id`),
KEY `idx_fit_articles_category` (`category_id`),
KEY `idx_fit_articles_subcat` (`subcategory_id`),
KEY `idx_fit_articles_author` (`author_id`),
KEY `idx_fit_articles_status_pub` (`status`, `published_at`),
KEY `idx_fit_articles_featured` (`is_featured`),
CONSTRAINT `fk_fit_articles_category` FOREIGN KEY (`category_id`) REFERENCES `fit_categories` (`id`) ON DELETE RESTRICT,
CONSTRAINT `fk_fit_articles_subcat` FOREIGN KEY (`subcategory_id`) REFERENCES `fit_subcategories` (`id`) ON DELETE SET NULL,
CONSTRAINT `fk_fit_articles_author` FOREIGN KEY (`author_id`) REFERENCES `fit_users` (`id`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='건강 콘텐츠 및 카드뉴스 아티클';
-- ------------------------------------------------------------------------------
-- 6. fit_fact_checks : 의학 전문 검증 리포트 및 학술 출처 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_fact_checks`;
CREATE TABLE `fit_fact_checks` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '팩트체크 리포트 번호 (PK)',
`article_id` BIGINT UNSIGNED NOT NULL COMMENT '대상 아티클 번호 (FK -> fit_articles.id, 1:1)',
`expert_id` BIGINT UNSIGNED NOT NULL COMMENT '검증 의료진 번호 (FK -> fit_experts.id)',
`verdict` ENUM('verified', 'caution', 'false_claim', 'needs_update') NOT NULL DEFAULT 'verified' COMMENT '검증 판정 (verified:의학적 사실, caution:주의필요, false_claim:사실아님, needs_update:추가연구필요)',
`summary` TEXT NOT NULL COMMENT '의학 검증 총평 및 가이드 요약',
`medical_points` JSON NOT NULL COMMENT '의학 검증 세부 포인트 (JSON Array)',
`references_citations` JSON NULL COMMENT '근거 학술 논문 및 가이드라인 출처 (JSON Array: [{title, journal, year, doi/url}])',
`verified_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '검증 완료 일시',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록 일시',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_fit_fact_checks_article` (`article_id`),
KEY `idx_fit_fact_checks_expert` (`expert_id`),
CONSTRAINT `fk_fit_fact_checks_article` FOREIGN KEY (`article_id`) REFERENCES `fit_articles` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_fit_fact_checks_expert` FOREIGN KEY (`expert_id`) REFERENCES `fit_experts` (`id`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='의학 전문 팩트체크 리포트';
-- ------------------------------------------------------------------------------
-- 7. fit_content_formats : 멀티 포맷 자동 변환 결과 테이블 (인스타/블로그/SNS/썸네일)
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_content_formats`;
CREATE TABLE `fit_content_formats` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '변환 포맷 고유 번호 (PK)',
`article_id` BIGINT UNSIGNED NOT NULL COMMENT '원천 아티클 번호 (FK -> fit_articles.id)',
`format_type` ENUM('card_news', 'blog_post', 'sns_short', 'video_thumbnail') NOT NULL COMMENT '변환 포맷 유형 (card_news:인스타카드뉴스, blog_post:블로그아티클, sns_short:단문SNS, video_thumbnail:유튜브썸네일)',
`title` VARCHAR(255) NULL COMMENT '포맷별 최적화 타이틀',
`payload_data` JSON NOT NULL COMMENT '포맷별 생성 데이터 (슬라이드 이미지 배열, 해시태그, 1문장 요약, 썸네일 레이아웃 등)',
`is_generated` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '자동 생성 완료 여부 (1:완료, 0:대기/실패)',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '변환 생성 일시',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (`id`),
KEY `idx_fit_formats_article_type` (`article_id`, `format_type`),
CONSTRAINT `fk_fit_formats_article` FOREIGN KEY (`article_id`) REFERENCES `fit_articles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='멀티 포맷 자동 변환 출력 데이터';
-- ------------------------------------------------------------------------------
-- 8. fit_bookmarks : 사용자 북마크 및 저장 목록 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_bookmarks`;
CREATE TABLE `fit_bookmarks` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '북마크 고유 번호 (PK)',
`user_id` BIGINT UNSIGNED NULL COMMENT '회원 번호 (로그인 사용자, FK -> fit_users.id)',
`session_id` VARCHAR(100) NULL COMMENT '비로그인 사용자 브라우저 식별 UUID / 세션 ID',
`article_id` BIGINT UNSIGNED NOT NULL COMMENT '북마크된 아티클 번호 (FK -> fit_articles.id)',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '북마크 저장 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_fit_bookmarks_user_art` (`user_id`, `article_id`),
KEY `idx_fit_bookmarks_session` (`session_id`, `article_id`),
KEY `idx_fit_bookmarks_article` (`article_id`),
CONSTRAINT `fk_fit_bookmarks_user` FOREIGN KEY (`user_id`) REFERENCES `fit_users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_fit_bookmarks_article` FOREIGN KEY (`article_id`) REFERENCES `fit_articles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='사용자 아티클 북마크';
-- ------------------------------------------------------------------------------
-- 9. fit_likes : 아티클 좋아요 기록 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_likes`;
CREATE TABLE `fit_likes` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '좋아요 고유 번호 (PK)',
`user_id` BIGINT UNSIGNED NULL COMMENT '회원 번호 (FK -> fit_users.id)',
`ip_hash` VARCHAR(64) NULL COMMENT '비로그인 유저 중복 방지용 IP 해시',
`article_id` BIGINT UNSIGNED NOT NULL COMMENT '좋아요한 아티클 번호 (FK -> fit_articles.id)',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '좋아요 클릭 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_fit_likes_user_art` (`user_id`, `article_id`),
KEY `idx_fit_likes_ip_art` (`ip_hash`, `article_id`),
KEY `idx_fit_likes_article` (`article_id`),
CONSTRAINT `fk_fit_likes_user` FOREIGN KEY (`user_id`) REFERENCES `fit_users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_fit_likes_article` FOREIGN KEY (`article_id`) REFERENCES `fit_articles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='아티클 좋아요 기록';
-- ------------------------------------------------------------------------------
-- 10. fit_view_logs : 아티클 조회 및 유입 분석 로그 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_view_logs`;
CREATE TABLE `fit_view_logs` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '조회 로그 고유 번호 (PK)',
`article_id` BIGINT UNSIGNED NOT NULL COMMENT '조회된 아티클 번호 (FK -> fit_articles.id)',
`user_id` BIGINT UNSIGNED NULL COMMENT '로그인 회원 번호 (FK -> fit_users.id)',
`device_type` ENUM('desktop', 'mobile', 'tablet') NOT NULL DEFAULT 'mobile' COMMENT '접속 디바이스 종류',
`referrer` VARCHAR(500) NULL COMMENT '유입 경로 URL',
`ip_hash` VARCHAR(64) NULL COMMENT '익명화된 접속 IP 해시',
`viewed_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '조회 일시',
PRIMARY KEY (`id`),
KEY `idx_fit_view_logs_article` (`article_id`),
KEY `idx_fit_view_logs_date` (`viewed_at`),
CONSTRAINT `fk_fit_view_logs_article` FOREIGN KEY (`article_id`) REFERENCES `fit_articles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='아티클 조회 통계 로그';
-- ------------------------------------------------------------------------------
-- 11. fit_settings : 사이트 전역 환경설정 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_settings`;
CREATE TABLE `fit_settings` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '설정 고유 번호 (PK)',
`setting_key` VARCHAR(50) NOT NULL COMMENT '설정 키 (예: site_name, hero_title, engine_enabled)',
`setting_value` LONGTEXT NULL COMMENT '설정 값',
`description` VARCHAR(255) NULL COMMENT '설정 항목 설명',
`group_name` VARCHAR(50) NOT NULL DEFAULT 'general' COMMENT '설정 그룹 분류 (general, seo, engine, auth)',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '최종 수정 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_fit_settings_key` (`setting_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='사이트 전역 환경설정';
-- ------------------------------------------------------------------------------
-- 12. fit_versions : 배포 및 버전 릴리즈 이력 테이블
-- ------------------------------------------------------------------------------
DROP TABLE IF EXISTS `fit_versions`;
CREATE TABLE `fit_versions` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '버전 이력 고유 번호 (PK)',
`version_tag` VARCHAR(20) NOT NULL COMMENT '버전 태그 (예: v 0.1, v 0.2, v 1.0)',
`commit_hash` VARCHAR(64) NULL COMMENT 'Git 커밋 해시',
`release_title` VARCHAR(255) NOT NULL COMMENT '릴리즈 제목',
`release_notes` TEXT NULL COMMENT '변경 내역 및 릴리즈 노트',
`deployed_by` VARCHAR(50) NOT NULL DEFAULT 'system' COMMENT '배포 실행자 (admin, system, pipeline)',
`deployed_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '배포 완료 일시',
PRIMARY KEY (`id`),
KEY `idx_fit_versions_tag` (`version_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='배포 및 버전 릴리즈 이력';
SET FOREIGN_KEY_CHECKS = 1;
-- ==============================================================================
-- INITIAL SEED DATA (초기 기본 데이터 및 사이트 컨텐츠 동기화)
-- ==============================================================================
-- 1. Initial Users (Admin & Medical Expert)
INSERT INTO `fit_users` (`id`, `user_id`, `email`, `password`, `name`, `nickname`, `role`, `status`) VALUES
(1, 'admin', '[email protected]', '$2y$10$e8wVf5r58vj1Ue47j8Kk2exQ9u8fMhO2T5W.i0W/Hq9v1U8Tf3Q9u', 'Fitgiv 관리자', '관리자', 'admin', 'active'),
(2, 'dr_kim', '[email protected]', '$2y$10$e8wVf5r58vj1Ue47j8Kk2exQ9u8fMhO2T5W.i0W/Hq9v1U8Tf3Q9u', '김도현 전문의', '닥터김', 'expert', 'active'),
(3, 'editor_lee', '[email protected]', '$2y$10$e8wVf5r58vj1Ue47j8Kk2exQ9u8fMhO2T5W.i0W/Hq9v1U8Tf3Q9u', '이수진 에디터', '헬스에디터', 'editor', 'active')
ON DUPLICATE KEY UPDATE `name`=VALUES(`name`);
-- 2. Initial Medical Expert Profile
INSERT INTO `fit_experts` (`id`, `user_id`, `license_number`, `specialty`, `affiliation`, `bio`, `verification_badge`, `is_verified`) VALUES
(1, 2, 'MED-2018-94812', '가정의학과 / 임상영양학', 'Fitgiv 메디컬 연구소 & 대학병원 외래교수', '근거 중심 의학(EBM)을 바탕으로 대중에게 유익하고 정확한 건강 지식을 검증 및 전달합니다.', '의학 검증 완료', 1)
ON DUPLICATE KEY UPDATE `specialty`=VALUES(`specialty`);
-- 3. Categories (Fitgiv Main Navigation)
INSERT INTO `fit_categories` (`id`, `slug`, `name`, `description`, `icon`, `color`, `sort_order`, `is_active`) VALUES
(1, 'life', '생활건강', '일상 속의 건강한 생활 습관 및 라이프스타일 가이드', 'health_and_safety', '#0052ff', 1, 1),
(2, 'disease', '질병·예방', '주요 질환에 대한 증상, 원인 및 과학적 예방 수칙', 'coronavirus', '#01696c', 2, 1),
(3, 'exercise', '영양·운동', '신체 균형과 활력을 위한 맞춤형 영양 및 운동 루틴', 'fitness_center', '#620bd3', 3, 1),
(4, 'factcheck', '팩트체크', '공인 의학 논문과 학술 가이드로 확인된 건강 팩트체크와 오해 해소', 'verified', '#003ec7', 4, 1)
ON DUPLICATE KEY UPDATE `name`=VALUES(`name`);
-- 4. Subcategories & Theme Filters
INSERT INTO `fit_subcategories` (`id`, `category_id`, `slug`, `name`, `sort_order`, `is_active`) VALUES
(1, 1, 'season', '계절별 건강', 1, 1),
(2, 1, 'age', '연령별 건강', 2, 1),
(3, 1, 'knowledge', '생활 상식', 3, 1),
(4, 1, 'stress', '스트레스 관리', 4, 1),
(5, 1, 'food', '음식/영양', 5, 1),
(6, 1, 'mental', '정신 건강', 6, 1),
(7, 1, 'workspace', '업무 환경', 7, 1),
(8, 1, 'water', '수분 섭취', 8, 1),
(9, 1, 'posture', '자세 교정', 9, 1)
ON DUPLICATE KEY UPDATE `name`=VALUES(`name`);
-- 5. Articles (Main Landing Card & List Items)
INSERT INTO `fit_articles` (`id`, `category_id`, `subcategory_id`, `author_id`, `title`, `subtitle`, `summary`, `key_points`, `thumbnail_url`, `read_time_minutes`, `is_featured`, `is_fact_checked`, `status`, `view_count`, `like_count`, `bookmark_count`, `published_at`) VALUES
(1, 1, 5, 2, '식후 바로 마시는 커피, 위 건강에 괜찮을까?', '커피와 위 건강 가이드', '식사 직후의 커피는 철분 흡수를 방해하고 위산 분비를 촉진할 수 있습니다. 식후 1~2시간 뒤에 마시는 것을 권장합니다.',
'["1. 철분 흡수 저해: 커피 속 탄닌 성분이 식사로 섭취한 철분의 흡수율을 최대 50%까지 떨어뜨릴 수 있습니다.", "2. 위산 역류 위험: 카페인이 하부 식도 괄약근을 이완시켜 위산 역류를 유발할 가능성이 높습니다.", "3. 권장 섭취 시점: 음식물이 어느 정도 소화된 식후 60~90분 이후에 섭취하는 것이 안전합니다."]',
'https://lh3.googleusercontent.com/aida-public/AB6AXuAsCv4yj-qzwhSxm_snwcn9PCiSuawwcyla0Vn6lh7Z1byF-Wjsy-X8uP8hOWnzUZyeKPcDGau6sWeraFsmAs-TD4dkzSmaH6IEDx5_C5MatprTSZDD1pcG5_gGdjP_r1LVyQyke2JeaQEYGWe3EGLcvarBTE5K04hjyYkXPoFvE-WmJ7no23obt-YGV6He4q4VuwDAEMgZRYsprJ_Z30DYxBYDqVgLsC6Y-SkwhzpJLXV5ob-yGAfi6w',
1, 1, 1, 'published', 14500, 1201, 842, '2026-08-20 10:00:00'),
(2, 4, 3, 2, '충분한 숙면을 위한 5가지 수면 위생 가이드', 'Today''s Pick: Fact Check', '수면의 질을 높이는 것은 단순한 휴식 이상의 의미를 갖습니다. 과학적으로 검증된 수면 위생 수칙을 통해 더 나은 내일을 준비하세요.',
'["1. 일정한 수면 주기 유지", "2. 취침 전 블루라이트 차단", "3. 카페인은 오후 2시 이전만 섭취", "4. 침실 온도 18~20도 유지", "5. 낮시간 20분 햇볕 쬐기"]',
'https://lh3.googleusercontent.com/aida-public/AB6AXuDD8AeLkgcMdqLjd8laMDUnEdfJoMxzdp55_1UGnERSndUJjVLvB4F-AWQY6eqd-Zeu4RAeT-837vkszQVcyKDPiTj3-EbwJz4BvNnstEl1PJ85KBNHulI4whbAT1DHBpENHJY6Rjlj8Mp6SDnW0bNrT4u-d2J1X4UNNA1w8cL4syzUgf251BSyFe0E4oG4XQcsAWOMwh8XfonnbbeLGcRSHzwqc0wFkez9ZNgEgx9zKm2l8ZpJ596w_A',
3, 1, 1, 'published', 8920, 754, 620, '2026-08-21 09:30:00'),
(3, 1, 1, 3, '미세먼지 심한 날, 올바른 환기법은?', '계절별 건강 관리', '공기청정기만으로는 부족할 수 있습니다. 미세먼지 농도가 높은 날에도 실내 공기 질을 유지하는 방법을 알아봅니다.',
'["1. 대기 이동이 활발한 오전 10시~오후 4시 사이에 5~10분간 짧게 맞통풍 환기", "2. 환기 후 분무기로 물을 뿌려 먼지를 가라앉힌 뒤 물걸레 청소", "3. 공기청정기는 환기 완료 후 창문을 닫고 가동"]',
'https://lh3.googleusercontent.com/aida-public/AB6AXuCWoK9ar7gYTbn1dm9zWfdiDtkKtaiTdUUuDmeErPllzBba61PqySylr_Ttj1CeSunWnVh76hcnOgQTiy8aw3nF7bVknbZkIEsuisnvN2xDfrtqkJbPNdyRm1tn2HhLGSjiB9FD4QsMZDrwM_zlv-Ph636WybUP36FtxUf-m0EpW8gd4WlBSc_aVA0VRYFVha9kMRuM2PHR_j2xnOEUnAi1AqCmeMsQ23sg6jvcoyPWb7vQlh3XzN2pHA',
3, 0, 1, 'published', 5320, 412, 318, '2026-08-21 14:00:00'),
(4, 1, 4, 3, '거북목 예방을 위한 1분 스트레칭', '스트레스 및 자세 관리', '장시간 모니터 앞에서의 업무. 목과 어깨의 긴장을 풀어주는 간단하지만 효과적인 스트레칭 동작을 소개합니다.',
'["1. 턱을 가슴 쪽으로 당겨 뒷목 늘리기 (10초 유지)", "2. 양손을 깍지 끼고 머리 뒤를 지그시 눌러주기", "3. 어깨를 뒤로 천천히 회전하며 견갑골 조이기"]',
'https://lh3.googleusercontent.com/aida-public/AB6AXuAHGXrDCdEkyyxzZV_fPVS2rmSefznN6tzskoaOoPW1IRFiqTCZBZfIYVNCw4ZyEeEANXNWbBKXcaa4JBd91REnilxUpFwXp_EqmEuZ73BdPFusMh9-e6V1oLMxm0qrTXANU8ocjzpsgXSalGPOVvsxoz_swI95Tk-w_69JZ9nQF0ApoXzgv5Ul1WeD3WW0lcRtjOlkiBd7g5W2CARFnxQv1PIIG_HWupzunGppLVKMJYfxBbFN7fY5xw',
2, 0, 1, 'published', 7840, 680, 512, '2026-08-22 11:00:00'),
(5, 1, 2, 2, '면역 세포를 깨우는 5가지 슈퍼푸드와 최적의 섭취 타이밍', '근거 중심 영양 가이드', '일상 식단에 손쉽게 추가할 수 있으면서도 과학적으로 면역 증진 효능이 입증된 핵심 식재료 5가지와 올바른 조리법을 소개합니다.',
'["1. 마늘(알리신): 다진 후 10분간 상온에 두어 활성화", "2. 브로콜리(설포라판): 1~3분 살짝 찌는 방식으로 영양소 보존", "3. 버섯류(베타글루칸): 면역 NK세포 활성화 및 비타민 D 보충", "4. 발효 요거트: 장내 유익균 증식 및 면역 밸런스 유지", "5. 강황: 올리브유/후추와 함께 섭취 시 흡수율 20배 증가"]',
'https://lh3.googleusercontent.com/aida-public/AB6AXuBIEUzW0IIZjGlapOfc0w1aXPIdZJA1y-7eqQlg7AGWaRkWb7NASYwCHZziVuFoicjtbok0SjoP3ExgwwHW1qlblPrhW3AL5YPJI_QOME_zN1CHtQROYtsvKRapWa_nqwbgUONQC2oFMa16SesWZ-26DDHsIwi19xE9fwMwgdb0yvTmADTVNbUboyagdfpyKDEYc9yxKnXGexr4Rop6b0MCu-vgX4FevjNONwyvgz1t1SsE9iByH6RC0Q',
4, 0, 1, 'published', 12450, 1090, 895, '2026-08-22 16:30:00'),
(6, 1, 3, 3, '올바른 물 마시기 습관: 시간대별 최적의 수분 충전 루틴', '하루 1.5L 스마트 수분 섭취법', '충분한 수분 섭취는 신진대사 촉진과 림프 순환, 피부 탄력 유지의 기본입니다. 언제, 어떻게 마셔야 몸에 잘 흡수되는지 알아봅니다.',
'["1. 기상 직후 미온수 1잔: 밤새 농축된 혈액 점도 완화", "2. 식사 30분 전 1잔: 과식 방지 및 소화액 분비 준비", "3. 시간당 150~200ml씩 자주 섭취: 신장 부담 없이 체내 흡수", "4. 찬물보다 미온수(30~40도): 위장 자극 최소화"]',
'https://lh3.googleusercontent.com/aida-public/AB6AXuCPggHie3j3hQl8POfo1W-_2Lqe1SHZoHVTY7_tFXQUrMz72FLDISul-nU5frUFHFVjrrvcEHQv7ouH_P9oos5BmL-A90wmxJI1Vl6qD4cD51AIz_Pz5uFrTwzRXV3xPYMpmBjoE4Ap4lBYBvtK8P4eQ_L0QYMSNaAQj2acY81F57OWy1P1NlFQ-YVhWihofIH5azEDai9W6zK45qphWEJmh-7DexmTRVWeEyJkbkRfGXnWqCe-RoNaKA',
3, 0, 1, 'published', 11200, 970, 810, '2026-08-23 08:00:00')
ON DUPLICATE KEY UPDATE `title`=VALUES(`title`);
-- 6. Fact Checks Data
INSERT INTO `fit_fact_checks` (`id`, `article_id`, `expert_id`, `verdict`, `summary`, `medical_points`, `references_citations`) VALUES
(1, 1, 1, 'verified', '식후 즉각적인 커피 섭취는 위산 역류 및 무기질 흡수 방해를 일으킬 수 있으므로 60분 이상 간격을 두는 것이 의학적으로 권고됩니다.',
'["1. 철분 흡수 저해: 탄닌 복합체 형성", "2. 하부 식도 괄약근 이완에 따른 역류성 식도염 위험", "3. 췌장 효소 분비 타이밍 조절 필요"]',
'[{"title": "Effects of Coffee on Gastrointestinal Function", "journal": "World Journal of Gastroenterology", "year": 2021}, {"title": "Inhibition of food iron absorption by coffee", "journal": "American Journal of Clinical Nutrition", "year": 2019}]')
ON DUPLICATE KEY UPDATE `summary`=VALUES(`summary`);
-- 7. Content Multi-Format Outputs (Central Hub Data for Article 1)
INSERT INTO `fit_content_formats` (`id`, `article_id`, `format_type`, `title`, `payload_data`, `is_generated`) VALUES
(1, 1, 'card_news', '식후 커피, 언제 마셔야 할까? [카드뉴스 5장]', '{"slides": [{"page": 1, "heading": "식후 바로 마시는 커피, 과연 안전할까?"}, {"page": 2, "heading": "1. 철분 흡수 최대 50% 저해"}, {"page": 3, "heading": "2. 식도 괄약근 이완과 위산 역류"}, {"page": 4, "heading": "3. 가장 안전한 골든타임: 식후 60분 뒤"}, {"page": 5, "heading": "건강한 커피 습관, Fitgiv와 함께하세요"}]}', 1),
(2, 1, 'blog_post', '식후 바로 마시는 커피가 위 건강과 영양 흡수에 미치는 영향 (전문의 검증)', '{"seo_description": "식사 직후 마시는 커피의 부작용과 의학적으로 안전한 섭취 타이밍 가이드", "tags": ["건강상식", "커피건강", "위건강", "식후커피", "Fitgiv"]}', 1),
(3, 1, 'sns_short', '식후 바로 마시는 커피는 철분 흡수를 방해해요! 식사 후 1시간 뒤에 마시는 습관을 들여보세요 ☕️', '{"character_count": 58, "platform": "twitter_kakao"}', 1),
(4, 1, 'video_thumbnail', '식후 커피, 위를 망치는 최악의 타이밍?! ☕️❌', '{"badge": "의학검증", "hook_text": "식후 바로 마시면 안 되는 충격적인 이유", "color_scheme": "blue_accent"}', 1)
ON DUPLICATE KEY UPDATE `title`=VALUES(`title`);
-- 8. Site Settings
INSERT INTO `fit_settings` (`setting_key`, `setting_value`, `description`, `group_name`) VALUES
('site_name', 'Fitgiv', '사이트 공식 명칭', 'general'),
('site_tagline', 'Give Better Health. 더 나은 건강을 전하다.', '브랜드 슬로건', 'general'),
('site_version', 'v 0.2', '현재 배포 버전', 'general'),
('engine_enabled', '1', '멀티 포맷 자동 변환 엔진 활성화 여부', 'engine')
ON DUPLICATE KEY UPDATE `setting_value`=VALUES(`setting_value`);
-- 9. Version Release History
INSERT INTO `fit_versions` (`version_tag`, `commit_hash`, `release_title`, `release_notes`, `deployed_by`) VALUES
('v 0.1', 'init_release_001', 'Fitgiv 메인 랜딩 페이지 및 디자인 시스템 구축', 'Material 3 톤 Tailwind CSS 테마, 반응형 헤더/푸터 및 코어 가치 섹션 개발', 'admin'),
('v 0.2', 'feat_list_page_002', '서브메뉴 리스트 페이지 및 모달 인터랙션 개발', '생활건강/질병/영양/팩트체크 카테고리 필터링 및 북마크, 상세 모달 구현', 'admin')
ON DUPLICATE KEY UPDATE `release_title`=VALUES(`release_title`);
-- ==============================================================================
-- End of Schema Definition
-- ==============================================================================