Spaces:
Running
Running
| -- ============================================================================ | |
| -- SmartEyeSsen Database Schema (Final Production Version v2) | |
| -- ============================================================================ | |
| -- ํ๋ก์ ํธ๋ช : SmartEyeSsen - AI ๊ธฐ๋ฐ ํ์ต์ง ๋ถ์ ์์คํ | |
| -- ๋ฐ์ดํฐ๋ฒ ์ด์ค: smarteyessen_db | |
| -- ๋ฌธ์์ : utf8mb4 (์ด๋ชจ์ง, ๋ค๊ตญ์ด ์ง์) | |
| -- ์์ง: InnoDB (ํธ๋์ญ์ , ์ธ๋ํค ์ง์) | |
| -- ์ด ํ ์ด๋ธ ์: 12๊ฐ | |
| -- ์ต์ข ์์ ์ผ: 2025-01-22 (v2) | |
| -- ์์ฑ์: SmartEyeSsen Team | |
| -- ์ฃผ์ ๋ณ๊ฒฝ์ฌํญ: ๋ฌธ์ ๋ ์ด์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋ฐ์ (์ต์ปค/์์ ๊ฐ๋ ) | |
| -- ============================================================================ | |
| -- ============================================================================ | |
| -- ๐ ํ ์ด๋ธ ๋ชฉ๋ก ๋ฐ ๊ด๊ณ (v2) | |
| -- ============================================================================ | |
| -- 1. users (์ฌ์ฉ์ ๊ด๋ฆฌ) - ๋ ๋ฆฝ ํ ์ด๋ธ | |
| -- 2. document_types (๋ฌธ์ ํ์ ์ ์) - ๋ ๋ฆฝ ํ ์ด๋ธ [์์ ] | |
| -- 3. projects (ํ๋ก์ ํธ/์ธ์ ) - FK: user_id, doc_type_id | |
| -- 4. pages (ํ์ด์ง ์ ๋ณด) - FK: project_id | |
| -- 5. layout_elements (๋ ์ด์์ ์์) - FK: page_id [์์ ] | |
| -- 6. text_contents (OCR ๊ฒฐ๊ณผ) - FK: element_id (1:1) | |
| -- 7. ai_descriptions (AI ์ค๋ช ) - FK: element_id (1:1) | |
| -- 8. question_groups (๋ฌธ์ ๊ทธ๋ฃน) - FK: page_id, anchor_element_id [์์ ] | |
| -- 9. question_elements (๋ฌธ์ -์์ ๋งคํ) - FK: question_group_id, element_id | |
| -- 10. text_versions (ํ ์คํธ ๋ฒ์ ๊ด๋ฆฌ) - FK: page_id, user_id | |
| -- 11. formatting_rules (ํฌ๋งทํ ๊ท์น) - FK: doc_type_id [์์ ] | |
| -- 12. combined_results (ํตํฉ ๋ฌธ์ ์บ์) - FK: project_id (1:1) | |
| -- ============================================================================ | |
| -- ๐ ์ฃผ์ ๊ด๊ณ ์์ฝ (v2) | |
| -- ============================================================================ | |
| -- users โ projects (1:N) | |
| -- document_types โ projects (1:N) | |
| -- document_types โ formatting_rules (1:N) | |
| -- projects โ pages (1:N) | |
| -- projects โ combined_results (1:1) | |
| -- pages โ layout_elements (1:N) | |
| -- pages โ question_groups (1:N) | |
| -- pages โ text_versions (1:N) | |
| -- layout_elements โ text_contents (1:1) | |
| -- layout_elements โ ai_descriptions (1:1) | |
| -- layout_elements โ question_groups (1:1) [์ ๊ท] - ์ต์ปค ๊ด๊ณ | |
| -- layout_elements โ question_elements (N:1) | |
| -- question_groups โ question_elements (1:N) | |
| -- ============================================================================ | |
| -- ๐ v2 ์ฃผ์ ๋ณ๊ฒฝ์ฌํญ | |
| -- ============================================================================ | |
| -- 1. document_types.sorting_method: 'coordinate_based' โ 'reading_order'๋ก ํตํฉ | |
| -- 2. layout_elements.order_index: ์ญ์ (Y,X ์ขํ๋ก ๋์ ์ ๋ ฌ) | |
| -- 3. question_groups.question_number: ์ญ์ | |
| -- 4. question_groups.anchor_element_id: ์ถ๊ฐ (FK โ layout_elements) | |
| -- 5. layout_elements โ question_groups: 1:1 ์ต์ปค ๊ด๊ณ ์ ์ค | |
| -- 6. formatting_rules: ์ต์ปค/์์ ํด๋์ค ๊ท์น ์ถ๊ฐ | |
| -- ============================================================================ | |
| -- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ (๊ธฐ์กด DB๊ฐ ์์ผ๋ฉด ์ญ์ ํ ์ฌ์์ฑ) | |
| -- ============================================================================ | |
| -- โ ๏ธ docker-entrypoint์ mysql ํด๋ผ์ด์ธํธ ๊ธฐ๋ณธ ๋ฌธ์์ ์ latin1์ด๋ฏ๋ก | |
| -- ํ๊ธ INSERT ๋ฌธ์ด ๊นจ์ง์ง ์๋๋ก ์ธ์ ๋ฌธ์์ ์ ๋จผ์ ๊ฐ์ ํ๋ค. | |
| SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; | |
| SET character_set_client = utf8mb4; | |
| SET character_set_connection = utf8mb4; | |
| SET character_set_results = utf8mb4; | |
| DROP DATABASE IF EXISTS smarteyessen_db; | |
| CREATE DATABASE smarteyessen_db | |
| CHARACTER SET utf8mb4 | |
| COLLATE utf8mb4_unicode_ci; | |
| USE smarteyessen_db; | |
| -- ============================================================================ | |
| -- 1๏ธโฃ Users Table (์ฌ์ฉ์ ๊ด๋ฆฌ) | |
| -- ============================================================================ | |
| -- ์ค๋ช : ์์คํ ์ฌ์ฉ์ ์ ๋ณด (ํ์, ๊ต์ฌ, ๊ด๋ฆฌ์) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๊ถํ ๊ด๋ฆฌ, API ํค ๊ด๋ฆฌ | |
| -- ============================================================================ | |
| CREATE TABLE users ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '์ฌ์ฉ์ ๊ณ ์ ID', | |
| email VARCHAR(255) NOT NULL UNIQUE COMMENT '์ด๋ฉ์ผ (๋ก๊ทธ์ธ ID)', | |
| name VARCHAR(100) NOT NULL COMMENT '์ฌ์ฉ์ ์ด๋ฆ', | |
| role VARCHAR(50) NOT NULL DEFAULT 'user' COMMENT '์ญํ (admin/teacher/student/user)', | |
| -- ๋ณด์ ์ ๋ณด | |
| password_hash VARCHAR(255) NOT NULL COMMENT 'bcrypt ํด์๋ ๋น๋ฐ๋ฒํธ', | |
| api_key VARCHAR(255) DEFAULT NULL COMMENT 'OpenAI API ํค (AES-256 ์ํธํ ์ ์ฅ)', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '๊ณ์ ์์ฑ์ผ', | |
| updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '๋ง์ง๋ง ์์ ์ผ', | |
| -- ์ธ๋ฑ์ค | |
| INDEX idx_email (email) COMMENT '์ด๋ฉ์ผ ๊ฒ์ ์ต์ ํ', | |
| INDEX idx_role (role) COMMENT '์ญํ ๋ณ ํํฐ๋ง ์ต์ ํ' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='์์คํ ์ฌ์ฉ์ ์ ๋ณด'; | |
| -- ============================================================================ | |
| -- 2๏ธโฃ Document_Types Table (๋ฌธ์ ํ์ ์ ์) [์์ ] | |
| -- ============================================================================ | |
| -- ์ค๋ช : ๋ฌธ์ ์ข ๋ฅ๋ณ ์ฒ๋ฆฌ ๋ฐฉ์ ์ ์ (๋ฌธ์ ์ง/์ผ๋ฐ๋ฌธ์) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ๋ชจ๋ธ ์ ํ, ์ ๋ ฌ ๋ฐฉ์ ์ง์ , ํฌ๋งทํ ๊ท์น ์ฐ๊ฒฐ | |
| -- [v2 ๋ณ๊ฒฝ] sorting_method ENUM: 'coordinate_based' โ 'reading_order'๋ก ํตํฉ | |
| -- ============================================================================ | |
| CREATE TABLE document_types ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| doc_type_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '๋ฌธ์ ํ์ ๊ณ ์ ID', | |
| type_name VARCHAR(100) NOT NULL UNIQUE COMMENT 'ํ์ ๋ช (worksheet/document/form)', | |
| -- ์ฒ๋ฆฌ ์ค์ [์์ ] | |
| model_name VARCHAR(100) NOT NULL COMMENT 'AI ๋ชจ๋ธ๋ช (SmartEyeSsen/DocLayout-YOLO)', | |
| sorting_method ENUM('QUESTION_BASED', 'READING_ORDER') NOT NULL | |
| COMMENT '์ ๋ ฌ ๋ฐฉ์: QUESTION_BASED(๋ฌธ์ ์ง, ์ต์ปค-์์ ์ฌ๊ท), READING_ORDER(์ผ๋ฐ๋ฌธ์, Y/X ์ขํ)', | |
| -- ๋ถ๊ฐ ์ ๋ณด | |
| description TEXT DEFAULT NULL COMMENT 'ํ์ ์ค๋ช ', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '์์ฑ์ผ', | |
| updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '์์ ์ผ', | |
| -- ์ธ๋ฑ์ค | |
| INDEX idx_type_name (type_name) COMMENT 'ํ์ ๋ช ๊ฒ์ ์ต์ ํ' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='๋ฌธ์ ํ์ ์ ์ (๋ฌธ์ ์ง/์ผ๋ฐ๋ฌธ์) - v2: ์ ๋ ฌ ๋ฐฉ์ ๋ช ํํ'; | |
| -- ============================================================================ | |
| -- 3๏ธโฃ Projects Table (ํ๋ก์ ํธ/์ธ์ ๊ด๋ฆฌ) | |
| -- ============================================================================ | |
| -- ์ค๋ช : ์ฌ์ฉ์์ ๋ถ์ ํ๋ก์ ํธ (์ฌ๋ฌ ํ์ด์ง ํฌํจ) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ํ๋ก์ ํธ ์์ฑ, ์งํ๋ฅ ์ถ์ , ์ํ ๊ด๋ฆฌ | |
| -- ============================================================================ | |
| CREATE TABLE projects ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| project_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'ํ๋ก์ ํธ ๊ณ ์ ID', | |
| user_id INT NOT NULL COMMENT '์์ ์ ID (FK: users, ON DELETE CASCADE)', | |
| doc_type_id INT NOT NULL COMMENT '๋ฌธ์ ํ์ ID (FK: document_types, ON DELETE RESTRICT)', | |
| project_name VARCHAR(255) NOT NULL COMMENT 'ํ๋ก์ ํธ ์ด๋ฆ', | |
| -- ์งํ ์ํ | |
| total_pages INT DEFAULT 0 COMMENT '์ด ํ์ด์ง ์ (ํธ๋ฆฌ๊ฑฐ๋ก ์๋ ๊ณ์ฐ)', | |
| analysis_mode ENUM('AUTO', 'MANUAL', 'HYBRID') DEFAULT 'AUTO' | |
| COMMENT '๋ถ์ ๋ชจ๋: AUTO(์๋), MANUAL(์๋), HYBRID(ํผํฉ)', | |
| status ENUM('CREATED', 'IN_PROGRESS', 'COMPLETED', 'ERROR') DEFAULT 'CREATED' | |
| COMMENT 'ํ๋ก์ ํธ ์ํ: CREATED(์์ฑ๋จ), IN_PROGRESS(์งํ์ค), COMPLETED(์๋ฃ), ERROR(์ค๋ฅ)', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'ํ๋ก์ ํธ ์์ฑ์ผ', | |
| updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '๋ง์ง๋ง ์์ ์ผ', | |
| -- ์ธ๋ํค ์ ์ฝ์กฐ๊ฑด | |
| CONSTRAINT fk_projects_user | |
| FOREIGN KEY (user_id) REFERENCES users(user_id) | |
| ON DELETE CASCADE, | |
| CONSTRAINT fk_projects_doctype | |
| FOREIGN KEY (doc_type_id) REFERENCES document_types(doc_type_id) | |
| ON DELETE RESTRICT, | |
| -- ์ธ๋ฑ์ค | |
| INDEX idx_user_id (user_id) COMMENT '์ฌ์ฉ์๋ณ ํ๋ก์ ํธ ์กฐํ ์ต์ ํ', | |
| INDEX idx_doc_type_id (doc_type_id) COMMENT 'ํ์ ๋ณ ํ๋ก์ ํธ ์กฐํ ์ต์ ํ', | |
| INDEX idx_status (status) COMMENT '์ํ๋ณ ํํฐ๋ง ์ต์ ํ' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='์ฌ์ฉ์ ํ๋ก์ ํธ ํ ์ด๋ธ. ๋ถ์ ์ธ์ ๋จ์ ๊ด๋ฆฌ.'; | |
| -- ============================================================================ | |
| -- 4๏ธโฃ Pages Table (ํ์ด์ง ์ ๋ณด) | |
| -- ============================================================================ | |
| -- ์ค๋ช : ํ๋ก์ ํธ ๋ด ๊ฐ๋ณ ํ์ด์ง (์ด๋ฏธ์ง ํ์ผ) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ํ์ด์ง ์์ ๊ด๋ฆฌ, ๋ถ์ ์ํ ์ถ์ , ์ด๋ฏธ์ง ์ ์ฅ | |
| -- ============================================================================ | |
| CREATE TABLE pages ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| page_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'ํ์ด์ง ๊ณ ์ ID', | |
| project_id INT NOT NULL COMMENT '์์ ํ๋ก์ ํธ ID (FK: projects, ON DELETE CASCADE)', | |
| page_number INT NOT NULL COMMENT 'ํ์ด์ง ๋ฒํธ (1๋ถํฐ ์์)', | |
| -- ์ด๋ฏธ์ง ์ ๋ณด | |
| image_path VARCHAR(500) NOT NULL COMMENT '์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก', | |
| image_width INT DEFAULT NULL COMMENT '์ด๋ฏธ์ง ๋๋น (ํฝ์ )', | |
| image_height INT DEFAULT NULL COMMENT '์ด๋ฏธ์ง ๋์ด (ํฝ์ )', | |
| -- ๋ถ์ ์ํ | |
| analysis_status ENUM('PENDING', 'PROCESSING', 'COMPLETED', 'ERROR') DEFAULT 'PENDING' | |
| COMMENT '๋ถ์ ์ํ: PENDING(๋๊ธฐ), PROCESSING(์ฒ๋ฆฌ์ค), COMPLETED(์๋ฃ), ERROR(์ค๋ฅ)', | |
| processing_time FLOAT DEFAULT NULL COMMENT '์ฒ๋ฆฌ ์๊ฐ (์ด)', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'ํ์ด์ง ์ถ๊ฐ์ผ', | |
| analyzed_at TIMESTAMP NULL DEFAULT NULL COMMENT '๋ถ์ ์๋ฃ์ผ', | |
| -- ์ธ๋ํค ์ ์ฝ์กฐ๊ฑด | |
| CONSTRAINT fk_pages_project | |
| FOREIGN KEY (project_id) REFERENCES projects(project_id) | |
| ON DELETE CASCADE, | |
| -- ๊ณ ์ ํค ๋ฐ ์ธ๋ฑ์ค | |
| UNIQUE KEY uk_project_page (project_id, page_number) | |
| COMMENT 'ํ๋ก์ ํธ ๋ด ํ์ด์ง ๋ฒํธ ์ค๋ณต ๋ฐฉ์ง', | |
| INDEX idx_project_id (project_id) COMMENT 'ํ๋ก์ ํธ๋ณ ํ์ด์ง ์กฐํ ์ต์ ํ', | |
| INDEX idx_analysis_status (analysis_status) COMMENT '์ํ๋ณ ํํฐ๋ง ์ต์ ํ' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='ํ๋ก์ ํธ ๋ด ํ์ด์ง ์ ๋ณด ํ ์ด๋ธ'; | |
| -- ============================================================================ | |
| -- 5๏ธโฃ Layout_Elements Table (๋ ์ด์์ ์์) [์์ ] | |
| -- ============================================================================ | |
| -- ์ค๋ช : AI ๋ชจ๋ธ์ด ๊ฒ์ถํ ๋ ์ด์์ ์์ (์ ๋ชฉ, ๋ณธ๋ฌธ, ๊ทธ๋ฆผ ๋ฑ) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ๋ฐ์ด๋ฉ ๋ฐ์ค ์ ์ฅ, ํด๋์ค ๋ถ๋ฅ, ์ขํ ๊ด๋ฆฌ | |
| -- [v2 ๋ณ๊ฒฝ] order_index ์ปฌ๋ผ ์ญ์ (Y,X ์ขํ๋ก ๋์ ์ ๋ ฌ) | |
| -- ============================================================================ | |
| CREATE TABLE layout_elements ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| element_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '์์ ๊ณ ์ ID', | |
| page_id INT NOT NULL COMMENT '์์ ํ์ด์ง ID (FK: pages, ON DELETE CASCADE)', | |
| -- ๋ถ๋ฅ ์ ๋ณด | |
| class_name VARCHAR(100) NOT NULL COMMENT 'ํด๋์ค๋ช (question_number/figure/table/text ๋ฑ)', | |
| confidence FLOAT NOT NULL COMMENT '์ ๋ขฐ๋ (0.0~1.0)', | |
| -- ๋ฐ์ด๋ฉ ๋ฐ์ค ์ขํ | |
| bbox_x INT NOT NULL COMMENT 'X ์ขํ (์ผ์ชฝ ์๋จ)', | |
| bbox_y INT NOT NULL COMMENT 'Y ์ขํ (์ผ์ชฝ ์๋จ)', | |
| bbox_width INT NOT NULL COMMENT '๋๋น (ํฝ์ )', | |
| bbox_height INT NOT NULL COMMENT '๋์ด (ํฝ์ )', | |
| -- ์๋ ๊ณ์ฐ ์ปฌ๋ผ (GENERATED COLUMN) | |
| area INT GENERATED ALWAYS AS (bbox_width * bbox_height) STORED | |
| COMMENT '๋ฉด์ (์๋ ๊ณ์ฐ)', | |
| y_position INT GENERATED ALWAYS AS (bbox_y) STORED | |
| COMMENT 'Y ์ ๋ ฌ์ฉ ์ขํ (์๋ ๊ณ์ฐ)', | |
| x_position INT GENERATED ALWAYS AS (bbox_x) STORED | |
| COMMENT 'X ์ ๋ ฌ์ฉ ์ขํ (์๋ ๊ณ์ฐ)', | |
| -- [v2 ์ญ์ ] order_index: (Y,X) ์ขํ๋ก ๋์ ์ ๋ ฌํ๋ฏ๋ก ๋ถํ์ | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '์์ฑ์ผ', | |
| -- ์ธ๋ํค | |
| CONSTRAINT fk_layout_elements_page | |
| FOREIGN KEY (page_id) REFERENCES pages(page_id) | |
| ON DELETE CASCADE, | |
| -- ์ธ๋ฑ์ค | |
| INDEX idx_page_id (page_id) COMMENT 'ํ์ด์ง๋ณ ์์ ์กฐํ ์ต์ ํ', | |
| INDEX idx_class_name (class_name) COMMENT 'ํด๋์ค๋ณ ํํฐ๋ง ์ต์ ํ', | |
| INDEX idx_position (page_id, y_position, x_position) | |
| COMMENT '์ขํ ๊ธฐ๋ฐ ์ ๋ ฌ ์ต์ ํ (๋ณตํฉ ์ธ๋ฑ์ค) - ํต์ฌ ์ธ๋ฑ์ค' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='AI๊ฐ ๊ฒ์ถํ ๋ ์ด์์ ์์ - v2: order_index ์ญ์ , (Y,X) ๋์ ์ ๋ ฌ'; | |
| -- ============================================================================ | |
| -- 6๏ธโฃ Text_Contents Table (OCR ๊ฒฐ๊ณผ) | |
| -- ============================================================================ | |
| -- ์ค๋ช : ๋ ์ด์์ ์์์์ ์ถ์ถํ ํ ์คํธ (OCR ๊ฒฐ๊ณผ) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: OCR ํ ์คํธ ์ ์ฅ, ์ธ์ด ๊ฐ์ง, ์ ๋ฌธ ๊ฒ์ | |
| -- ๊ด๊ณ: layout_elements์ 1:1 ๊ด๊ณ | |
| -- ============================================================================ | |
| CREATE TABLE text_contents ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| text_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'OCR ๊ฒฐ๊ณผ ๊ณ ์ ID', | |
| element_id INT NOT NULL COMMENT '๋ ์ด์์ ์์ ID (1:1 ๋งคํ, FK: layout_elements, ON DELETE CASCADE)', | |
| -- OCR ๊ฒฐ๊ณผ | |
| ocr_text TEXT NOT NULL COMMENT 'OCR ์ถ์ถ ํ ์คํธ', | |
| ocr_engine VARCHAR(50) DEFAULT 'PaddleOCR' COMMENT '์ฌ์ฉํ OCR ์์ง', | |
| ocr_confidence FLOAT DEFAULT NULL COMMENT 'OCR ์ ๋ขฐ๋ (0.0~1.0)', | |
| language VARCHAR(10) DEFAULT 'ko' COMMENT '์ธ์ด ์ฝ๋ (ko/en/ja/zh)', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '์์ฑ์ผ', | |
| -- ์ธ๋ํค | |
| CONSTRAINT fk_text_contents_element | |
| FOREIGN KEY (element_id) REFERENCES layout_elements(element_id) | |
| ON DELETE CASCADE, | |
| -- ์ ์ฝ์กฐ๊ฑด ๋ฐ ์ธ๋ฑ์ค | |
| UNIQUE KEY uk_element (element_id) COMMENT '1:1 ๊ด๊ณ ๋ณด์ฅ (์ค๋ณต ๋ฐฉ์ง)', | |
| INDEX idx_language (language) COMMENT '์ธ์ด๋ณ ํํฐ๋ง ์ต์ ํ', | |
| FULLTEXT INDEX ft_ocr_text (ocr_text) WITH PARSER ngram | |
| COMMENT 'ํ๊ธ/์๋ฌธ ์ ๋ฌธ ๊ฒ์ (n-gram ํ์ ์ฌ์ฉ)' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='OCR ์ถ์ถ ํ ์คํธ'; | |
| -- ============================================================================ | |
| -- 7๏ธโฃ AI_Descriptions Table (AI ์ค๋ช ) | |
| -- ============================================================================ | |
| -- ์ค๋ช : ๊ทธ๋ฆผ/ํ์ ๋ํ AI ์์ฑ ์ค๋ช (GPT-4o-mini) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ์๊ฐ ์๋ฃ ํ ์คํธ ์ค๋ช , ํ๋กฌํํธ ์ด๋ ฅ ๊ด๋ฆฌ | |
| -- ๊ด๊ณ: layout_elements์ 1:1 ๊ด๊ณ | |
| -- ============================================================================ | |
| CREATE TABLE ai_descriptions ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| ai_desc_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'AI ์ค๋ช ๊ณ ์ ID', | |
| element_id INT NOT NULL COMMENT '๋ ์ด์์ ์์ ID (1:1 ๋งคํ, FK: layout_elements, ON DELETE CASCADE)', | |
| -- AI ์์ฑ ๊ฒฐ๊ณผ | |
| description TEXT NOT NULL COMMENT 'AI๊ฐ ์์ฑํ ์ค๋ช ํ ์คํธ', | |
| ai_model VARCHAR(100) DEFAULT 'gpt-4o-mini' COMMENT '์ฌ์ฉํ AI ๋ชจ๋ธ๋ช ', | |
| prompt_used TEXT DEFAULT NULL COMMENT '์ฌ์ฉํ ํ๋กฌํํธ (๋๋ฒ๊น ์ฉ)', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '์์ฑ์ผ', | |
| -- ์ธ๋ํค | |
| CONSTRAINT fk_ai_descriptions_element | |
| FOREIGN KEY (element_id) REFERENCES layout_elements(element_id) | |
| ON DELETE CASCADE, | |
| -- ์ ์ฝ์กฐ๊ฑด ๋ฐ ์ธ๋ฑ์ค | |
| UNIQUE KEY uk_element (element_id) COMMENT '1:1 ๊ด๊ณ ๋ณด์ฅ (์ค๋ณต ๋ฐฉ์ง)', | |
| INDEX idx_ai_model (ai_model) COMMENT '๋ชจ๋ธ๋ณ ํํฐ๋ง ์ต์ ํ' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='๊ทธ๋ฆผ/ํ์ ๋ํ AI ์์ฑ ์ค๋ช '; | |
| -- ============================================================================ | |
| -- 8๏ธโฃ Question_Groups Table (๋ฌธ์ ๊ทธ๋ฃน) [์์ ] | |
| -- ============================================================================ | |
| -- ์ค๋ช : ๋ฌธ์ ์ง์์ ๊ฐ์ง๋ ๋ฌธ์ ๋จ์ (์ต์ปค ์์ ๊ธฐ์ค) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ์ต์ปค ์์ ๊ด๋ฆฌ, Y์ขํ ๋ฒ์ ์ ์ฅ, ์์ ์นด์ดํธ | |
| -- ๊ด๊ณ: pages์ 1:N, layout_elements์ 1:1 (์ต์ปค) | |
| -- [v2 ๋ณ๊ฒฝ] question_number ์ญ์ , anchor_element_id ์ถ๊ฐ | |
| -- ============================================================================ | |
| CREATE TABLE question_groups ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| question_group_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '๋ฌธ์ ๊ทธ๋ฃน ๊ณ ์ ID', | |
| page_id INT NOT NULL COMMENT '์์ ํ์ด์ง ID (FK: pages, ON DELETE CASCADE)', | |
| -- [v2 ์ถ๊ฐ] ์ต์ปค ์์ ์ฐธ์กฐ | |
| anchor_element_id INT NOT NULL COMMENT '์ต์ปค ์์ ID (FK: layout_elements, ON DELETE CASCADE)', | |
| -- Y์ขํ ๋ฒ์ (์ต์ปค Y ์ขํ ~ ๋ค์ ์ต์ปค ์ง์ ) | |
| start_y INT NOT NULL COMMENT '๋ฌธ์ ์์ Y์ขํ', | |
| end_y INT NOT NULL COMMENT '๋ฌธ์ ์ข ๋ฃ Y์ขํ', | |
| -- ํต๊ณ ์ ๋ณด | |
| element_count INT DEFAULT 0 COMMENT '๋ฌธ์ ์ ์ํ ์์ ๊ฐ์ (์์ ์์ ์)', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '์์ฑ์ผ', | |
| -- ์ธ๋ํค | |
| CONSTRAINT fk_question_groups_page | |
| FOREIGN KEY (page_id) REFERENCES pages(page_id) | |
| ON DELETE CASCADE, | |
| -- [v2 ์ถ๊ฐ] ์ต์ปค ์์์ 1:1 ๊ด๊ณ | |
| CONSTRAINT fk_question_groups_anchor | |
| FOREIGN KEY (anchor_element_id) REFERENCES layout_elements(element_id) | |
| ON DELETE CASCADE, | |
| -- ์ ์ฝ์กฐ๊ฑด ๋ฐ ์ธ๋ฑ์ค | |
| -- [v2 ์์ ] anchor_element_id๋ ์ ๋ํฌ (ํ๋์ ์ต์ปค๋ ํ๋์ ๊ทธ๋ฃน๋ง ์์ฑ) | |
| UNIQUE KEY uk_anchor_element (anchor_element_id) | |
| COMMENT '์ต์ปค ์์ ์ค๋ณต ๋ฐฉ์ง (1:1 ๊ด๊ณ)', | |
| INDEX idx_page_id (page_id) COMMENT 'ํ์ด์ง๋ณ ๋ฌธ์ ์กฐํ ์ต์ ํ' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='๋ฌธ์ ๊ทธ๋ฃน - v2: ์ต์ปค ์์ ๊ธฐ์ค, question_number ์ญ์ '; | |
| -- ============================================================================ | |
| -- 9๏ธโฃ Question_Elements Table (๋ฌธ์ -์์ ๋งคํ) | |
| -- ============================================================================ | |
| -- ์ค๋ช : ๋ฌธ์ ๊ทธ๋ฃน๊ณผ ์์ ์์์ ๋งคํ ํ ์ด๋ธ | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ๋ฌธ์ ๋ณ ์์ ์์ ๊ทธ๋ฃนํ, ์์ ๊ด๋ฆฌ | |
| -- ๊ด๊ณ: question_groups (1:N) โ question_elements โ (N:1) layout_elements | |
| -- ============================================================================ | |
| CREATE TABLE question_elements ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| qe_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '๋งคํ ๋ ์ฝ๋ ๊ณ ์ ID', | |
| question_group_id INT NOT NULL COMMENT '๋ฌธ์ ๊ทธ๋ฃน ID (FK: question_groups, ON DELETE CASCADE)', | |
| element_id INT NOT NULL COMMENT '์์ ์์ ID (FK: layout_elements, ON DELETE CASCADE)', | |
| -- ์์ ์ ๋ณด | |
| order_in_question INT NOT NULL COMMENT '๋ฌธ์ ๋ด ์์ ์์ (1, 2, 3, ...) - Y์ขํ ๊ธฐ์ค ์๋ ์ ๋ ฌ', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '์์ฑ์ผ', | |
| -- ์ธ๋ํค | |
| CONSTRAINT fk_question_elements_group | |
| FOREIGN KEY (question_group_id) REFERENCES question_groups(question_group_id) | |
| ON DELETE CASCADE, | |
| CONSTRAINT fk_question_elements_element | |
| FOREIGN KEY (element_id) REFERENCES layout_elements(element_id) | |
| ON DELETE CASCADE, | |
| -- ์ ์ฝ์กฐ๊ฑด ๋ฐ ์ธ๋ฑ์ค | |
| UNIQUE KEY uk_question_element (question_group_id, element_id) | |
| COMMENT '๋ฌธ์ -์์ ์ค๋ณต ๋งคํ ๋ฐฉ์ง', | |
| INDEX idx_order (question_group_id, order_in_question) | |
| COMMENT '์์๋ณ ์ ๋ ฌ ์ต์ ํ (๋ณตํฉ ์ธ๋ฑ์ค)' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='๋ฌธ์ -์์ ๋งคํ ํ ์ด๋ธ (์์ ์์ ๊ด๋ฆฌ)'; | |
| -- ============================================================================ | |
| -- ๐ Text_Versions Table (ํ ์คํธ ๋ฒ์ ๊ด๋ฆฌ) | |
| -- ============================================================================ | |
| -- ์ค๋ช : ํ์ด์ง๋ณ ํ ์คํธ ๋ฒ์ ์ด๋ ฅ (์๋ณธ/์๋ํฌ๋งท/์ฌ์ฉ์์์ ) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ๋ฒ์ ๊ด๋ฆฌ, ์์ ์ด๋ ฅ ์ถ์ , ํ์ฌ ๋ฒ์ ํ๋๊ทธ | |
| -- ๊ด๊ณ: pages์ 1:N ๊ด๊ณ | |
| -- ============================================================================ | |
| CREATE TABLE text_versions ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| version_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '๋ฒ์ ๊ณ ์ ID', | |
| page_id INT NOT NULL COMMENT '์์ ํ์ด์ง ID (FK: pages, ON DELETE CASCADE)', | |
| user_id INT DEFAULT NULL COMMENT '์์ ํ ์ฌ์ฉ์ ID (์ฌ์ฉ์ ์์ ์, FK: users, ON DELETE SET NULL)', | |
| -- ๋ฒ์ ์ ๋ณด | |
| content TEXT NOT NULL COMMENT 'ํ ์คํธ ๋ด์ฉ', | |
| version_number INT NOT NULL COMMENT '๋ฒ์ ๋ฒํธ (1, 2, 3, ...)', | |
| version_type ENUM('ORIGINAL', 'AUTO_FORMATTED', 'USER_EDITED') NOT NULL | |
| COMMENT '๋ฒ์ ์ ํ: ORIGINAL(์๋ณธ), AUTO_FORMATTED(์๋ํฌ๋งท), USER_EDITED(์ฌ์ฉ์์์ )', | |
| -- ์ํ ํ๋๊ทธ | |
| is_current BOOLEAN DEFAULT FALSE COMMENT 'ํ์ฌ ๋ฒ์ ์ฌ๋ถ (TRUE: ํ์ฌ ๋ฒ์ )', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '๋ฒ์ ์์ฑ์ผ', | |
| -- ์ธ๋ํค | |
| CONSTRAINT fk_text_versions_page | |
| FOREIGN KEY (page_id) REFERENCES pages(page_id) | |
| ON DELETE CASCADE, | |
| CONSTRAINT fk_text_versions_user | |
| FOREIGN KEY (user_id) REFERENCES users(user_id) | |
| ON DELETE SET NULL, | |
| -- ์ ์ฝ์กฐ๊ฑด ๋ฐ ์ธ๋ฑ์ค | |
| UNIQUE KEY uk_page_version (page_id, version_number) | |
| COMMENT 'ํ์ด์ง ๋ด ๋ฒ์ ๋ฒํธ ์ค๋ณต ๋ฐฉ์ง', | |
| INDEX idx_page_id (page_id) COMMENT 'ํ์ด์ง๋ณ ๋ฒ์ ์กฐํ ์ต์ ํ', | |
| INDEX idx_is_current (is_current) COMMENT 'ํ์ฌ ๋ฒ์ ๋น ๋ฅธ ์กฐํ' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='ํ์ด์ง๋ณ ํ ์คํธ ๋ฒ์ ๊ด๋ฆฌ'; | |
| -- ============================================================================ | |
| -- 1๏ธโฃ1๏ธโฃ Formatting_Rules Table (ํฌ๋งทํ ๊ท์น) [์์ ] | |
| -- ============================================================================ | |
| -- ์ค๋ช : ๋ฌธ์ ํ์ ๋ณ ํด๋์ค๋ณ ํฌ๋งทํ ๊ท์น (์ ๋์ฌ/์ ๋ฏธ์ฌ/๋ค์ฌ์ฐ๊ธฐ) | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ์๋ ํฌ๋งทํ ๊ท์น ๊ด๋ฆฌ, ๋์ ๊ท์น ๋ณ๊ฒฝ | |
| -- ๊ด๊ณ: document_types์ 1:N ๊ด๊ณ | |
| -- [v2 ๋ณ๊ฒฝ] ์ต์ปค/์์ ํด๋์ค ๊ท์น ์ถ๊ฐ (Initial Data ์ฐธ์กฐ) | |
| -- ============================================================================ | |
| CREATE TABLE formatting_rules ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| rule_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '๊ท์น ๊ณ ์ ID', | |
| doc_type_id INT NOT NULL COMMENT '๋ฌธ์ ํ์ ID (FK: document_types, ON DELETE CASCADE)', | |
| class_name VARCHAR(100) NOT NULL COMMENT '์ ์ฉ ํด๋์ค๋ช (question_number/figure/text ๋ฑ)', | |
| -- ํฌ๋งทํ ์ค์ | |
| prefix VARCHAR(200) DEFAULT '' COMMENT '์ ๋์ฌ (์: "\\n\\n", " ")', | |
| suffix VARCHAR(200) DEFAULT '' COMMENT '์ ๋ฏธ์ฌ (์: ". ", "\\n")', | |
| indent_level INT DEFAULT 0 COMMENT '๋ค์ฌ์ฐ๊ธฐ ๋ ๋ฒจ (0~10)', | |
| -- ์คํ์ผ ์ค์ (์ ํ ์ฌํญ) | |
| font_size VARCHAR(20) DEFAULT NULL COMMENT 'ํฐํธ ํฌ๊ธฐ (์: "14pt")', | |
| font_weight VARCHAR(20) DEFAULT NULL COMMENT 'ํฐํธ ๋๊ป (์: "bold")', | |
| -- ํ์์คํฌํ | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '๊ท์น ์์ฑ์ผ', | |
| updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '๊ท์น ์์ ์ผ', | |
| -- ์ธ๋ํค | |
| CONSTRAINT fk_formatting_rules_doctype | |
| FOREIGN KEY (doc_type_id) REFERENCES document_types(doc_type_id) | |
| ON DELETE CASCADE, | |
| -- ์ ์ฝ์กฐ๊ฑด ๋ฐ ์ธ๋ฑ์ค | |
| UNIQUE KEY uk_type_class (doc_type_id, class_name) | |
| COMMENT 'ํ์ ๋ณ ํด๋์ค ๊ท์น ์ค๋ณต ๋ฐฉ์ง', | |
| INDEX idx_doc_type_id (doc_type_id) COMMENT 'ํ์ ๋ณ ๊ท์น ์กฐํ ์ต์ ํ' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='๋ฌธ์ ํ์ ๋ณ ํฌ๋งทํ ๊ท์น - v2: ์ต์ปค/์์ ํด๋์ค ๊ท์น ์ถ๊ฐ'; | |
| -- ============================================================================ | |
| -- 1๏ธโฃ2๏ธโฃ Combined_Results Table (ํตํฉ ๋ฌธ์ ์บ์) | |
| -- ============================================================================ | |
| -- ์ค๋ช : ํ๋ก์ ํธ์ ๋ชจ๋ ํ์ด์ง๋ฅผ ํตํฉํ ์ต์ข ๊ฒฐ๊ณผ ์บ์ | |
| -- ์ฃผ์ ๊ธฐ๋ฅ: ํตํฉ ํ ์คํธ ์ ์ฅ, ํต๊ณ ์ ๋ณด, ๋ค์ด๋ก๋ ์ต์ ํ | |
| -- ๊ด๊ณ: projects์ 1:1 ๊ด๊ณ | |
| -- ============================================================================ | |
| CREATE TABLE combined_results ( | |
| -- ๊ธฐ๋ณธ ์ ๋ณด | |
| combined_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'ํตํฉ ๊ฒฐ๊ณผ ๊ณ ์ ID', | |
| project_id INT NOT NULL COMMENT 'ํ๋ก์ ํธ ID (1:1 ๋งคํ, FK: projects, ON DELETE CASCADE)', | |
| -- ํตํฉ ๊ฒฐ๊ณผ | |
| combined_text LONGTEXT NOT NULL COMMENT 'ํตํฉ๋ ์ ์ฒด ํ ์คํธ (ํ์ด์ง๋ณ ๊ฒฐ๊ณผ ํฉ์นจ)', | |
| combined_stats JSON DEFAULT NULL COMMENT 'ํต๊ณ ์ ๋ณด (JSON ํ์: ํ์ด์ง์, ๋จ์ด์, ๋ฌธ์ ์ ๋ฑ)', | |
| -- ํ์์คํฌํ | |
| generated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '์ต์ด ์์ฑ์ผ', | |
| updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '๋ง์ง๋ง ์ ๋ฐ์ดํธ์ผ', | |
| -- ์ธ๋ํค | |
| CONSTRAINT fk_combined_results_project | |
| FOREIGN KEY (project_id) REFERENCES projects(project_id) | |
| ON DELETE CASCADE, | |
| -- ์ ์ฝ์กฐ๊ฑด ๋ฐ ์ธ๋ฑ์ค | |
| UNIQUE KEY uk_project (project_id) COMMENT '1:1 ๊ด๊ณ ๋ณด์ฅ (ํ๋ก์ ํธ๋น 1๊ฐ ์บ์)', | |
| INDEX idx_project_id (project_id) COMMENT 'ํ๋ก์ ํธ๋ณ ์บ์ ์กฐํ ์ต์ ํ' | |
| ) ENGINE=InnoDB | |
| DEFAULT CHARSET=utf8mb4 | |
| COLLATE=utf8mb4_unicode_ci | |
| COMMENT='ํ๋ก์ ํธ ํตํฉ ๋ฌธ์ ์บ์'; | |
| -- ============================================================================ | |
| -- ๐ง Triggers (ํธ๋ฆฌ๊ฑฐ) | |
| -- ============================================================================ | |
| -- ํธ๋ฆฌ๊ฑฐ 1: ํ์ด์ง ์ถ๊ฐ ์ projects.total_pages ์๋ ์ฆ๊ฐ | |
| -- ============================================================================ | |
| DELIMITER // | |
| CREATE TRIGGER trg_update_total_pages | |
| AFTER INSERT ON pages | |
| FOR EACH ROW | |
| BEGIN | |
| -- ์ ํ์ด์ง๊ฐ ์ถ๊ฐ๋๋ฉด ํด๋น ํ๋ก์ ํธ์ total_pages๋ฅผ 1 ์ฆ๊ฐ | |
| UPDATE projects | |
| SET total_pages = ( | |
| SELECT COUNT(*) | |
| FROM pages | |
| WHERE project_id = NEW.project_id | |
| ) | |
| WHERE project_id = NEW.project_id; | |
| END// | |
| DELIMITER ; | |
| -- ============================================================================ | |
| -- ํธ๋ฆฌ๊ฑฐ 2: ํ์ด์ง ์ญ์ ์ projects.total_pages ์๋ ๊ฐ์ | |
| -- ============================================================================ | |
| DELIMITER // | |
| CREATE TRIGGER trg_update_total_pages_on_delete | |
| AFTER DELETE ON pages | |
| FOR EACH ROW | |
| BEGIN | |
| -- ํ์ด์ง๊ฐ ์ญ์ ๋๋ฉด ํด๋น ํ๋ก์ ํธ์ total_pages๋ฅผ ์ฌ๊ณ์ฐ | |
| UPDATE projects | |
| SET total_pages = ( | |
| SELECT COUNT(*) | |
| FROM pages | |
| WHERE project_id = OLD.project_id | |
| ) | |
| WHERE project_id = OLD.project_id; | |
| END// | |
| DELIMITER ; | |
| -- ============================================================================ | |
| -- ๐ Initial Data (์ด๊ธฐ ๋ฐ์ดํฐ) [v2 ์์ ] | |
| -- ============================================================================ | |
| -- ์์คํ ๊ธฐ๋ณธ ์ค์ ๋ฐ์ดํฐ ์ฝ์ | |
| -- ============================================================================ | |
| -- 1. Document Types (๋ฌธ์ ํ์ 2๊ฐ) [์์ ] | |
| INSERT INTO document_types (type_name, model_name, sorting_method, description) VALUES | |
| ('worksheet', 'SmartEyeSsen', 'QUESTION_BASED', '์ํ ๋ฌธ์ ์ง - ์ต์ปค/์์ ์ฌ๊ท ์ ๋ ฌ (question_type, question_number ๊ธฐ์ค)'), | |
| ('document', 'DocLayout-YOLO', 'READING_ORDER', '์ผ๋ฐ ๋ฌธ์ - Y/X ์ขํ ๊ธฐ์ค ์์ฐจ ์ ๋ ฌ'); | |
| -- 2. Formatting Rules - worksheet (๋ฌธ์ ์ง) [formatter_rules.py ๊ธฐ์ค] | |
| INSERT INTO formatting_rules (doc_type_id, class_name, prefix, suffix, indent_level, font_size, font_weight) VALUES | |
| (1, 'question type', '\n\n[', ']\n', 0, NULL, NULL), | |
| (1, 'question number', '\n\n', '. ', 0, NULL, NULL), | |
| (1, 'second_question_number', '\n ', '', 3, NULL, NULL), | |
| (1, 'question text', '', '\n', 3, NULL, NULL), | |
| (1, 'plain text', '', '\n', 0, NULL, NULL), | |
| (1, 'unit', '', '\n', 3, NULL, NULL), | |
| (1, 'list', ' - ', '\n', 0, NULL, NULL), | |
| (1, 'choices', '', '\n', 3, NULL, NULL), | |
| (1, 'figure', '\n [๊ทธ๋ฆผ ์ค๋ช ]\n', '\n\n', 3, NULL, NULL), | |
| (1, 'table', '\n [ํ ์ค๋ช ]\n', '\n\n', 3, NULL, NULL), | |
| (1, 'flowchart', '\n [์์๋ ์ค๋ช ]\n', '\n\n', 3, NULL, NULL), | |
| (1, 'figure_caption', ' (๊ทธ๋ฆผ ์บก์ ) ', '\n\n', 0, NULL, NULL), | |
| (1, 'table caption', ' (ํ ์บก์ ) ', '\n\n', 0, NULL, NULL), | |
| (1, 'table footnote', ' * ', '\n', 0, NULL, NULL), | |
| (1, 'formula_caption', ' (์์ ์ค๋ช ) ', '\n', 0, NULL, NULL), | |
| (1, 'isolated_formula', '\n [์์]\n', '\n', 3, NULL, NULL); | |
| -- 3. Formatting Rules - document (์ผ๋ฐ ๋ฌธ์) | |
| INSERT INTO formatting_rules (doc_type_id, class_name, prefix, suffix, indent_level, font_size, font_weight) VALUES | |
| (2, 'title', '', '\n\n', 0, NULL, NULL), | |
| (2, 'heading', '\n', '\n\n', 0, NULL, NULL), | |
| (2, 'plain text', '', '\n\n', 0, NULL, NULL), | |
| (2, 'list', '', '\n', 0, NULL, NULL), | |
| (2, 'figure', '\n[๊ทธ๋ฆผ] ', '\n\n', 0, NULL, NULL), | |
| (2, 'table', '\n[ํ] ', '\n\n', 0, NULL, NULL), | |
| (2, 'figure_caption', '(๊ทธ๋ฆผ ์บก์ ) ', '\n', 0, NULL, NULL), | |
| (2, 'table caption', '(ํ ์บก์ ) ', '\n', 0, NULL, NULL), | |
| (2, 'table footnote', '* ', '\n', 0, NULL, NULL); | |
| -- ============================================================================ | |
| -- ๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ ์๋ฃ! (v2) | |
| -- ============================================================================ | |
| -- ๐ ๋ค์ ๋จ๊ณ: | |
| -- 1. MySQL Workbench์์ erd_schema_v2.sql ํ์ผ ์คํ | |
| -- 2. ํ ์ด๋ธ ์์ฑ ํ์ธ: SHOW TABLES; | |
| -- 3. ์ด๊ธฐ ๋ฐ์ดํฐ ํ์ธ: | |
| -- - SELECT * FROM document_types; | |
| -- - SELECT * FROM formatting_rules WHERE doc_type_id = 1; | |
| -- 4. ๋ฐฑ์๋ ORM ์ฐ๊ฒฐ (SQLAlchemy) | |
| -- - question_groups.anchor_element_id FK ์ค์ ํ์ธ | |
| -- - layout_elements โ question_groups ๊ด๊ณ ๋งคํ | |
| -- 5. ๋ฌธ์ ๋ ์ด์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ | |
| -- - services/sorting_service.py ์์ฑ | |
| -- - ์ต์ปค ์์ ํํฐ๋ง (question_type, question_number, ...) | |
| -- - Y์ขํ ๊ธฐ์ค ์ฌ๊ท์ ๋ถํ | |
| -- - ์์ ์์ (Y,X) ์ ๋ ฌ ๋ฐ question_elements ์ ์ฅ | |
| -- 6. API ์๋ํฌ์ธํธ ๊ฐ๋ฐ | |
| -- - POST /api/pages/{page_id}/sort | |
| -- - GET /api/pages/{page_id}/sorted-result | |
| -- 7. ํ ์คํธ | |
| -- - 16ํ์ด์ง (section + question_number) | |
| -- - 42ํ์ด์ง (question_number๋ง) | |
| -- - 14ํ์ด์ง (question_number + second_question_number) | |
| -- ============================================================================ | |
| -- ============================================================================ | |
| -- ๐ v2 ์ฃผ์ ๋ณ๊ฒฝ์ฌํญ ์์ฝ | |
| -- ============================================================================ | |
| -- 1. document_types.sorting_method: | |
| -- - 'coordinate_based' โ 'reading_order'๋ก ํตํฉ | |
| -- - 'question_based': ์ต์ปค/์์ ์ฌ๊ท ์ ๋ ฌ | |
| -- - 'reading_order': Y/X ์ขํ ์์ฐจ ์ ๋ ฌ | |
| -- | |
| -- 2. layout_elements: | |
| -- - order_index ์ปฌ๋ผ ์ญ์ | |
| -- - (Y,X) ์ขํ๋ก ๋์ ์ ๋ ฌ (idx_position ์ธ๋ฑ์ค ํ์ฉ) | |
| -- | |
| -- 3. question_groups: | |
| -- - question_number ์ปฌ๋ผ ์ญ์ | |
| -- - anchor_element_id ์ปฌ๋ผ ์ถ๊ฐ (FK โ layout_elements) | |
| -- - layout_elements์ 1:1 ์ต์ปค ๊ด๊ณ ์ ์ค | |
| -- | |
| -- 4. formatting_rules: | |
| -- - ์ต์ปค ํด๋์ค 5๊ฐ ์ถ๊ฐ | |
| -- (question_type, unit, question_number, second_question_number, third_question_number) | |
| -- - ์์ ํด๋์ค 11๊ฐ ์ถ๊ฐ | |
| -- (question_text, list, choices, parenthesis_blank, underline_blank, | |
| -- figure, table, flowchart, equation, caption, footnote) | |
| -- | |
| -- 5. ๊ด๊ณ ๋ณ๊ฒฝ: | |
| -- - layout_elements โ question_groups: 1:1 ์ต์ปค ๊ด๊ณ (์ ๊ท) | |
| -- - anchor_element_id๋ UNIQUE (ํ๋์ ์ต์ปค = ํ๋์ ๊ทธ๋ฃน) | |
| -- - ON DELETE CASCADE: ์ต์ปค ์ญ์ ์ ๊ทธ๋ฃน ๋ฐ question_elements ์ฐ์ ์ญ์ | |
| -- | |
| -- ============================================================================ | |
| -- ============================================================================ | |
| -- ๊ธฐ๋ณธ ํ ์คํธ ์ฌ์ฉ์ ์์ฑ | |
| -- ============================================================================ | |
| INSERT INTO users (user_id, email, name, role, password_hash, api_key, created_at, updated_at) | |
| VALUES | |
| (1, 'test@smarteyessen.com', 'ํ ์คํธ ์ฌ์ฉ์', 'user', 'dummy_hash_for_test', NULL, NOW(), NOW()), | |
| (2, 'admin@smarteyessen.com', '๊ด๋ฆฌ์', 'admin', 'dummy_hash_for_admin', NULL, NOW(), NOW()) | |
| ON DUPLICATE KEY UPDATE | |
| email = VALUES(email), | |
| name = VALUES(name); | |
| -- ============================================================================ | |