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κ° μμΌλ©΄ μμ ν μ¬μμ±) | |
| -- ============================================================================ | |
| 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(50) DEFAULT '' COMMENT 'μ λμ¬ (μ: "\\n\\n", " ")', | |
| suffix VARCHAR(50) 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 (λ¬Έμ μ§) [v2 μμ ] | |
| -- μ΅μ»€ ν΄λμ€ (Anchors): κ·Έλ£Ήμ μμ±νλ μμ | |
| INSERT INTO formatting_rules (doc_type_id, class_name, prefix, suffix, indent_level, font_size, font_weight) VALUES | |
| -- μ΅μ»€ 1: λ¨μ/λ¬Έμ μ ν (question_type, unit) | |
| (1, 'question_type', '\n\n[', ']\n', 0, '14pt', 'bold'), | |
| (1, 'unit', '\n\n', '\n', 0, '14pt', 'bold'), | |
| -- μ΅μ»€ 2: λλ¬Έμ λ²νΈ (question_number) | |
| (1, 'question_number', '\n\n', '. ', 0, '14pt', 'bold'), | |
| -- μ΅μ»€ 3: μλ¬Έμ λ²νΈ (second_question_number) | |
| (1, 'second_question_number', '\n (', ') ', 3, NULL, NULL), | |
| -- μ΅μ»€ 4: νμ μλ¬Έμ λ²νΈ (third_question_number, μμ κ²½μ°) | |
| (1, 'third_question_number', '\n ', '. ', 6, NULL, NULL); | |
| -- μμ ν΄λμ€ (Children): μ΅μ»€μ μνλ μμ | |
| INSERT INTO formatting_rules (doc_type_id, class_name, prefix, suffix, indent_level, font_size, font_weight) VALUES | |
| -- μμ 1: λ¬Έμ λ³Έλ¬Έ | |
| (1, 'question_text', ' ', '\n', 3, NULL, NULL), | |
| -- μμ 2: λͺ©λ‘ | |
| (1, 'list', ' - ', '\n', 3, NULL, NULL), | |
| -- μμ 3: μ νμ§ | |
| (1, 'choices', ' ', '\n', 3, NULL, NULL), | |
| -- μμ 4: κ΄νΈ λΉμΉΈ | |
| (1, 'parenthesis_blank', ' ( )', '\n', 3, NULL, NULL), | |
| -- μμ 5: λ°μ€ λΉμΉΈ | |
| (1, 'underline_blank', ' __________', '\n', 3, NULL, NULL), | |
| -- μμ 6: κ·Έλ¦Ό | |
| (1, 'figure', '\n [κ·Έλ¦Ό μ€λͺ ]\n ', '\n', 3, NULL, NULL), | |
| -- μμ 7: ν | |
| (1, 'table', '\n [ν μ€λͺ ]\n ', '\n', 3, NULL, NULL), | |
| -- μμ 8: μμλ | |
| (1, 'flowchart', '\n [μμλ μ€λͺ ]\n ', '\n', 3, NULL, NULL), | |
| -- μμ 9: μμ | |
| (1, 'equation', ' ', '\n', 3, NULL, NULL), | |
| -- μμ 10: μΊ‘μ | |
| (1, 'caption', ' ', '\n', 3, '10pt', NULL), | |
| -- μμ 11: κ°μ£Ό | |
| (1, 'footnote', '\n * ', '\n', 3, '9pt', NULL), | |
| -- νΉμ: μ λͺ© (νμ΄μ§ μ΅μλ¨) | |
| (1, 'title', '', '\n\n', 0, '16pt', 'bold'), | |
| -- νΉμ: νμ΄μ§ λ²νΈ (νμ΄μ§ μ΅νλ¨) | |
| (1, 'page', '\n\nβββββββββββββββββββββ\nνμ΄μ§ ', '\nβββββββββββββββββββββ\n\n', 0, '10pt', 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, '18pt', 'bold'), | |
| -- μμ λͺ© | |
| (2, 'heading', '\n', '\n\n', 0, '16pt', 'bold'), | |
| -- λ³Έλ¬Έ ν μ€νΈ | |
| (2, 'plain text', '', '\n\n', 0, NULL, NULL), | |
| -- κ·Έλ¦Ό | |
| (2, 'figure', '\n[κ·Έλ¦Ό ', ']\n\n', 0, NULL, NULL), | |
| -- κ·Έλ¦Ό μΊ‘μ | |
| (2, 'figure_caption', '', '\n', 2, '10pt', NULL), | |
| -- ν | |
| (2, 'table', '\n[ν ', ']\n\n', 0, NULL, NULL), | |
| -- ν μΊ‘μ | |
| (2, 'table_caption', '', '\n', 2, '10pt', NULL), | |
| -- ν κ°μ£Ό | |
| (2, 'table_footnote', '\n* ', '\n', 2, '9pt', NULL), | |
| -- μμ | |
| (2, 'isolate_formula', '\n', '\n\n', 2, NULL, NULL), | |
| -- μμ μΊ‘μ | |
| (2, 'formula_caption', '', '\n', 2, '10pt', 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 μ°μ μμ | |
| -- | |
| -- ============================================================================ |