---
url: https://docs.nemo12.com/reference/data-dictionary/knowledge-learner-model.md
description: >-
  Từ điển dữ liệu D1, domain Tri thức & Learner Model: 11 bảng,
  assessment_responses tới subjects; cột, kiểu, khoá ngoại, index.
---

# Data Dictionary · Tri thức & Learner Model

> ⚙️ **Trang này sinh tự động** từ source code bằng `scripts/gen-reference.mjs` — đừng sửa tay, sửa code rồi chạy `npm run gen:reference`.

Thuộc [Data Dictionary](../data-dictionary.md). 11 bảng, `assessment_responses` tới `subjects`.

## `assessment_responses`

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `session_id` | TEXT | NOT NULL REFERENCES assessment_sessions(id) |
| `learner_id` | TEXT | NOT NULL |
| `item_id` | TEXT | NOT NULL |
| `subject_id` | TEXT | NOT NULL |
| `node_id` | TEXT | NOT NULL |
| `selected_index` | INTEGER | NOT NULL |
| `correct` | INTEGER | NOT NULL |
| `response_ms` | INTEGER | — |
| `created_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |

**Khóa ngoại:** `session_id` → `assessment_sessions`

**Index:** `idx_responses_session`(session_id) · `idx_responses_learner_time`(learner_id, created_at DESC, item_id) · `idx_responses_learner_subject`(learner_id, subject_id, created_at DESC)

## `assessment_sessions`

Assessment sessions + responses.

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `learner_id` | TEXT | NOT NULL REFERENCES learners(id) |
| `subject_id` | TEXT | NOT NULL |
| `kind` | TEXT | NOT NULL DEFAULT 'diagnostic' CHECK (kind IN ('diagnostic','placement','practice','mastery_check')) |
| `status` | TEXT | NOT NULL DEFAULT 'in_progress' CHECK (status IN ('in_progress','completed','abandoned')) |
| `item_ids_json` | TEXT | NOT NULL |
| `created_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| `completed_at` | TEXT | — |
| `adaptive_json` | TEXT |  — thêm ở 0069_diagnostic_adaptive.sql |

**Khóa ngoại:** `learner_id` → `learners`

**Index:** `idx_sessions_learner`(learner_id, subject_id)

## `blueprints`

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `subject_id` | TEXT | NOT NULL REFERENCES subjects(id) |
| `title_vi` | TEXT | NOT NULL |
| `kind` | TEXT | NOT NULL CHECK (kind IN ('conditional','specialized')) |
| `cut_score` | REAL | — |
| `max_score` | REAL | — |
| `description` | TEXT | — |

**Khóa ngoại:** `subject_id` → `subjects`

## `items`

Item Bank (SDD-004 §9) — question tái sử dụng cho diagnostic/practice/assessment.

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `subject_id` | TEXT | NOT NULL |
| `node_id` | TEXT | NOT NULL |
| `role` | TEXT | NOT NULL CHECK (role IN ('canonical','variant','boundary','discriminator')) |
| `difficulty` | REAL | NOT NULL |
| `prompt` | TEXT | NOT NULL |
| `options_json` | TEXT | NOT NULL |
| `correct_index` | INTEGER | NOT NULL |
| `misconception` | TEXT | — |
| `source` | TEXT | NOT NULL DEFAULT 'chuyenchon' |
| `status` | TEXT | NOT NULL DEFAULT 'published'
CHECK (status IN ('candidate','published','retired')) — thêm ở 0032_content_lifecycle.sql |
| `quality_json` | TEXT |  — thêm ở 0032_content_lifecycle.sql |
| `quality_score` | REAL |  — thêm ở 0032_content_lifecycle.sql |
| `evaluator_count` | INTEGER | NOT NULL DEFAULT 0 — thêm ở 0032_content_lifecycle.sql |
| `created_at` | TEXT |  — thêm ở 0032_content_lifecycle.sql |
| `updated_at` | TEXT |  — thêm ở 0032_content_lifecycle.sql |
| `published_at` | TEXT |  — thêm ở 0032_content_lifecycle.sql |
| `published_by` | TEXT |  — thêm ở 0032_content_lifecycle.sql |
| `screen_flags_json` | TEXT |  — thêm ở 0032_content_lifecycle.sql |
| `review_status` | TEXT | NOT NULL DEFAULT 'unreviewed' — thêm ở 0049_experience_review.sql |
| `last_reviewed_at` | TEXT |  — thêm ở 0049_experience_review.sql |
| `answer_kind` | TEXT | NOT NULL DEFAULT 'mcq' — thêm ở 0073_item_answer_kinds.sql |
| `answer_spec_json` | TEXT |  — thêm ở 0073_item_answer_kinds.sql |
| `purpose_vi` | TEXT |  — thêm ở 0178_item_purpose.sql |

**Index:** `idx_items_node`(subject_id, node_id) · `idx_items_status`(status, subject_id, node_id) · `idx_items_quality`(status, quality_score) · `idx_items_node_status`(node_id, status) · `idx_items_prompt_norm`(LOWER(TRIM(prompt)

## `learner_evidence`

Evidence Registry (SDD-002 §5) — immutable, idempotency key.

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `event_id` | TEXT | NOT NULL UNIQUE |
| `learner_id` | TEXT | NOT NULL REFERENCES learners(id) |
| `subject_id` | TEXT | NOT NULL |
| `node_id` | TEXT | NOT NULL |
| `source` | TEXT | NOT NULL |
| `type` | TEXT | NOT NULL |
| `observed_performance` | REAL | NOT NULL |
| `reliability` | REAL | NOT NULL |
| `difficulty` | REAL | — |
| `payload_json` | TEXT | — |
| `occurred_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| `mastery_before` | REAL |  — thêm ở 0044_evidence_mastery_delta.sql |
| `mastery_after` | REAL |  — thêm ở 0044_evidence_mastery_delta.sql |

**Khóa ngoại:** `learner_id` → `learners`

**Index:** `idx_evidence_learner_node`(learner_id, subject_id, node_id) · `idx_evidence_learner_time`(learner_id, occurred_at)

## `learner_goals`

Learner goal (chọn blueprint mục tiêu) — SDD-002 §3, SDD-008 §5.

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `learner_id` | TEXT | NOT NULL REFERENCES learners(id) |
| `blueprint_id` | TEXT | NOT NULL REFERENCES blueprints(id) |
| `status` | TEXT | NOT NULL DEFAULT 'active' CHECK (status IN ('active','achieved','dropped')) |
| `created_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| — | *table constraint* | `PRIMARY KEY (learner_id, blueprint_id)` |

**Khóa ngoại:** `learner_id` → `learners` · `blueprint_id` → `blueprints`

## `learner_skill_state`

Learner mastery state (SDD-002 §2, SDD-007 §14) — computed state, mastery/confidence 0..1.

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `learner_id` | TEXT | NOT NULL REFERENCES learners(id) |
| `subject_id` | TEXT | NOT NULL |
| `node_id` | TEXT | NOT NULL |
| `mastery` | REAL | NOT NULL DEFAULT 0 |
| `confidence` | REAL | NOT NULL DEFAULT 0 |
| `trajectory` | TEXT | NOT NULL DEFAULT 'unknown' CHECK (trajectory IN ('improving','stable','declining','unknown')) |
| `evidence_count` | INTEGER | NOT NULL DEFAULT 0 |
| `last_evidence_at` | TEXT | — |
| `updated_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| — | *table constraint* | `PRIMARY KEY (learner_id, subject_id, node_id)` |

**Khóa ngoại:** `learner_id` → `learners`

## `skill_edges`

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `subject_id` | TEXT | NOT NULL |
| `from_node` | TEXT | NOT NULL |
| `to_node` | TEXT | NOT NULL |
| `type` | TEXT | NOT NULL CHECK (type IN ('prereq','related')) |
| — | *table constraint* | `PRIMARY KEY (subject_id, from_node, to_node, type)` |

**Index:** `idx_skill_edges_to`(subject_id, to_node)

## `skill_nodes`

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `subject_id` | TEXT | NOT NULL REFERENCES subjects(id) |
| `id` | TEXT | NOT NULL |
| `strand` | TEXT | NOT NULL |
| `grade` | INTEGER | — |
| `level` | INTEGER | — |
| `title_vi` | TEXT | NOT NULL |
| `title_en` | TEXT | — |
| `description` | TEXT | — |
| `effort_minutes` | INTEGER | — |
| `lab_slug` | TEXT | — |
| `source` | TEXT | NOT NULL DEFAULT 'chuyenchon' |
| — | *table constraint* | `PRIMARY KEY (subject_id, id)` |
| `title_en` | TEXT |  — thêm ở 0012_bilingual_taxonomy.sql |
| `unit` | TEXT |  — thêm ở 0020_node_units.sql |
| `unit_order` | INTEGER |  — thêm ở 0020_node_units.sql |
| `module` | TEXT |  — thêm ở 0023_node_modules.sql |
| `module_order` | INTEGER |  — thêm ở 0023_node_modules.sql |
| `module_en` | TEXT |  — thêm ở 0025_module_unit_en.sql |
| `unit_en` | TEXT |  — thêm ở 0025_module_unit_en.sql |
| `module_short` | TEXT |  — thêm ở 0042_short_names.sql |
| `module_short_en` | TEXT |  — thêm ở 0042_short_names.sql |
| `unit_short` | TEXT |  — thêm ở 0042_short_names.sql |
| `unit_short_en` | TEXT |  — thêm ở 0042_short_names.sql |
| `review_status` | TEXT | NOT NULL DEFAULT 'unreviewed' — thêm ở 0049_experience_review.sql |
| `hidden_at` | TEXT |  — thêm ở 0049_experience_review.sql |
| `hidden_reason` | TEXT |  — thêm ở 0049_experience_review.sql |
| `last_reviewed_at` | TEXT |  — thêm ở 0049_experience_review.sql |
| `reviewed_by` | TEXT |  — thêm ở 0049_experience_review.sql |
| `objective_vi` | TEXT |  — thêm ở 0049_experience_review.sql |
| `depth_level` | TEXT |  — thêm ở 0049_experience_review.sql |
| `bloom` | TEXT |  — thêm ở 0049_experience_review.sql |
| `pedagogy` | TEXT |  — thêm ở 0049_experience_review.sql |
| `prerequisites_note` | TEXT |  — thêm ở 0049_experience_review.sql |
| `common_misconception` | TEXT |  — thêm ở 0049_experience_review.sql |
| `why_pain` | TEXT |  — thêm ở 0053_unit_why.sql |
| `why_gain` | TEXT |  — thêm ở 0053_unit_why.sql |
| `why_example` | TEXT |  — thêm ở 0053_unit_why.sql |
| `can_do` | TEXT |  — thêm ở 0054_unit_can_do.sql |
| `i_will` | TEXT |  — thêm ở 0057_i_will.sql |
| `module_i_will` | TEXT |  — thêm ở 0057_i_will.sql |
| `unit_evidence` | TEXT |  — thêm ở 0065_unit_pearl_notes.sql |
| `unit_misconception` | TEXT |  — thêm ở 0065_unit_pearl_notes.sql |

**Khóa ngoại:** `subject_id` → `subjects`

**Index:** `idx_skill_nodes_subject_grade`(subject_id, grade) · `idx_skill_nodes_unit`(subject_id, strand, grade, unit_order) · `idx_skill_nodes_module`(subject_id, strand, module_order, unit_order) · `idx_skill_nodes_course_source`(source, subject_id)

## `strands`

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `subject_id` | TEXT | NOT NULL REFERENCES subjects(id) |
| `code` | TEXT | NOT NULL |
| `name_vi` | TEXT | NOT NULL |
| `short` | TEXT | — |
| `accent` | TEXT | — |
| `icon` | TEXT | — |
| — | *table constraint* | `PRIMARY KEY (subject_id, code)` |
| `name_en` | TEXT |  — thêm ở 0012_bilingual_taxonomy.sql |
| `short_en` | TEXT |  — thêm ở 0042_short_names.sql |
| `ord` | INTEGER |  — thêm ở 0043_strand_order.sql |
| `i_will` | TEXT |  — thêm ở 0057_i_will.sql |
| `big_idea` | TEXT |  — thêm ở 0066_strand_big_idea.sql |

**Khóa ngoại:** `subject_id` → `subjects`

**Index:** `idx_strands_ord`(subject_id, ord)

## `subjects`

Migration 0002 — Knowledge Registry + Skill Graph + Item Bank + Learner Mastery. SDD-003 §2-3 (registry, graph), SDD-004 §9 (item bank), SDD-002 §2/§5 (learner state, evidence). Canonical skill (SDD-007 §5): PK (subject_id, id); school chỉ thêm context, không nhân bản.

migration: `0002_knowledge_learner.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `name_vi` | TEXT | NOT NULL |
| `source` | TEXT | NOT NULL DEFAULT 'chuyenchon' |
| `name_en` | TEXT |  — thêm ở 0012_bilingual_taxonomy.sql |
