Files
gtsit/database/schema.sql
2026-08-10 21:19:10 +09:00

72 lines
3.1 KiB
SQL

CREATE TABLE IF NOT EXISTS admins (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(80) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
display_name VARCHAR(100) NOT NULL,
is_active TINYINT(1) NOT NULL DEFAULT 1,
failed_attempts TINYINT UNSIGNED NOT NULL DEFAULT 0,
locked_until DATETIME NULL,
last_login_at DATETIME NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS posts (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
slug VARCHAR(220) NOT NULL UNIQUE,
category VARCHAR(50) NOT NULL,
excerpt VARCHAR(500) NOT NULL DEFAULT '',
body MEDIUMTEXT NOT NULL,
author VARCHAR(100) NOT NULL DEFAULT '(주)지티에스정보통신',
status ENUM('draft', 'published') NOT NULL DEFAULT 'draft',
published_at DATETIME NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at DATETIME NULL,
INDEX idx_posts_public (status, published_at, deleted_at),
INDEX idx_posts_category (category)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS post_images (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
post_id BIGINT UNSIGNED NOT NULL,
file_path VARCHAR(500) NOT NULL,
alt_text VARCHAR(255) NOT NULL DEFAULT '',
caption VARCHAR(500) NOT NULL DEFAULT '',
sort_order SMALLINT UNSIGNED NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_post_images_post FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
INDEX idx_post_images_order (post_id, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS inquiries (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
ticket VARCHAR(32) NOT NULL UNIQUE,
name VARCHAR(120) NOT NULL,
phone VARCHAR(30) NOT NULL,
email VARCHAR(190) NULL,
inquiry_type VARCHAR(60) NOT NULL,
title VARCHAR(200) NOT NULL,
body TEXT NOT NULL,
password_hash VARCHAR(255) NOT NULL,
status ENUM('pending', 'in_progress', 'replied', 'closed') NOT NULL DEFAULT 'pending',
reply TEXT NULL,
replied_at DATETIME NULL,
closed_at DATETIME NULL,
lookup_failed_attempts TINYINT UNSIGNED NOT NULL DEFAULT 0,
lookup_locked_until DATETIME NULL,
consent_at DATETIME NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at DATETIME NULL,
INDEX idx_inquiries_status (status, created_at),
INDEX idx_inquiries_retention (closed_at, deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS site_settings (
setting_key VARCHAR(100) PRIMARY KEY,
setting_value TEXT NOT NULL,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;