-- ============================================================= -- 포트폴리오 스키마 참조 파일 (MariaDB / utf8mb4) -- 실제 생성은 서버 기동 시 Data/PortfolioSchemaInitializer.cs 가 담당한다. -- 이 파일은 수동 배포·점검용 사본이며, 몇 번을 실행해도 안전하다(멱등). -- - 테이블: CREATE TABLE IF NOT EXISTS -- - 시드 : INSERT IGNORE (slug 유니크 키로 중복 삽입 차단) -- created_at / updated_at 은 애플리케이션이 DateTime.UtcNow 로 직접 기록한다. -- (ON UPDATE CURRENT_TIMESTAMP 에 의존하지 않는다.) -- ============================================================= CREATE TABLE IF NOT EXISTS tb_portfolio_category ( category_no INT AUTO_INCREMENT PRIMARY KEY, slug VARCHAR(64) NOT NULL, name VARCHAR(100) NOT NULL, description VARCHAR(255) NULL, accent VARCHAR(32) NULL, sort_order INT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_portfolio_category_slug (slug) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS tb_portfolio_post ( post_no INT AUTO_INCREMENT PRIMARY KEY, category_no INT NOT NULL, title VARCHAR(200) NOT NULL, summary VARCHAR(500) NULL, content_md MEDIUMTEXT NULL, thumbnail_url VARCHAR(500) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY ix_portfolio_post_category (category_no), CONSTRAINT fk_portfolio_post_category FOREIGN KEY (category_no) REFERENCES tb_portfolio_category (category_no) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS tb_portfolio_post_image ( image_no INT AUTO_INCREMENT PRIMARY KEY, post_no INT NOT NULL, image_url VARCHAR(500) NOT NULL, caption VARCHAR(255) NULL, sort_order INT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY ix_portfolio_post_image_post (post_no), CONSTRAINT fk_portfolio_post_image_post FOREIGN KEY (post_no) REFERENCES tb_portfolio_post (post_no) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ------------------------------------------------------------- -- 기본 카테고리 시드 (재실행해도 중복되지 않음) -- ------------------------------------------------------------- INSERT IGNORE INTO tb_portfolio_category (slug, name, description, accent, sort_order, created_at) VALUES ('game', '게임', 'Unity 게임 프로젝트', '#7c5cff', 1, UTC_TIMESTAMP()); INSERT IGNORE INTO tb_portfolio_category (slug, name, description, accent, sort_order, created_at) VALUES ('dev', '개발', '서버 · 툴 · 시스템', '#20d5c4', 2, UTC_TIMESTAMP()); INSERT IGNORE INTO tb_portfolio_category (slug, name, description, accent, sort_order, created_at) VALUES ('art', '아트', '그래픽 · UI · 연출', '#ff5c9a', 3, UTC_TIMESTAMP()); INSERT IGNORE INTO tb_portfolio_category (slug, name, description, accent, sort_order, created_at) VALUES ('log', '기록', '작업 일지와 회고', '#ffb74d', 4, UTC_TIMESTAMP());