Data Dictionary · Student Portrait
⚙️ 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ạynpm run gen:reference.
Thuộc Data Dictionary. 7 bảng, external_activities tới portraits.
external_activities
migration: 0011_student_portrait.sql
| Cột | Kiểu | Ràng buộc / ghi chú |
|---|---|---|
id | TEXT | PRIMARY KEY |
learner_id | TEXT | NOT NULL REFERENCES learners(id) |
activity | TEXT | NOT NULL |
category | TEXT | — |
start_date | TEXT | — |
frequency | TEXT | — |
hours_per_week | REAL | — |
learner_interest | INTEGER | CHECK (learner_interest BETWEEN 1 AND 5), -- CHỈ learner sửa (REQ-POR-03) |
parent_support | INTEGER | CHECK (parent_support BETWEEN 1 AND 5), -- CHỈ parent sửa |
importance | TEXT | — |
notes | TEXT | — |
created_by_user_id | TEXT | NOT NULL |
created_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
updated_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
Khóa ngoại: learner_id → learners
Index: idx_external_activities_learner(learner_id)
milestones
migration: 0011_student_portrait.sql
| Cột | Kiểu | Ràng buộc / ghi chú |
|---|---|---|
id | TEXT | PRIMARY KEY |
learner_id | TEXT | NOT NULL REFERENCES learners(id) |
portrait_id | TEXT | REFERENCES portraits(id) |
kind | TEXT | NOT NULL CHECK (kind IN ('exam','academic','capability','language','habit','portfolio','experience','personal')) |
title | TEXT | NOT NULL |
target_value | TEXT | — |
target_date | TEXT | — |
expected_value | TEXT | — |
actual_result | TEXT | — |
status | TEXT | NOT NULL DEFAULT 'planned' CHECK (status IN ('planned','in_progress','achieved','missed','rescheduled')) |
confidence | REAL | — |
notes | TEXT | — |
created_by_user_id | TEXT | NOT NULL |
created_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
updated_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
track_id | TEXT | REFERENCES portrait_tracks(id) — thêm ở 0017_portrait_tracks.sql |
Khóa ngoại: learner_id → learners · portrait_id → portraits
Index: idx_milestones_learner(learner_id, target_date) · idx_milestones_track(track_id, target_date)
portrait_learner_sections
Bản của CON trong Student Portrait (SRC-106, chủ dự án 2026-08-14): mỗi mục lớn có hai cột — cột bố mẹ viết (portraits.sections_json, đã có) và cột con tự viết (bảng này). Tên mục lớn dùng chung để hai bên nói cùng một chuyện, nội dung thì mỗi bên một cột. Nemo có tiếng nói bằng CHÍNH LỜI của mình, không chỉ bấm đồng ý / không đồng ý (SDD-015 §1).
migration: 0029_portrait_learner_sections.sql
| Cột | Kiểu | Ràng buộc / ghi chú |
|---|---|---|
portrait_id | TEXT | NOT NULL REFERENCES portraits(id) |
section_key | TEXT | NOT NULL |
items_json | TEXT | NOT NULL DEFAULT '[]' |
updated_by_user_id | TEXT | — |
updated_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| — | table constraint | PRIMARY KEY (portrait_id, section_key) |
Khóa ngoại: portrait_id → portraits
Index: idx_portrait_learner_sections(portrait_id)
portrait_reactions
migration: 0011_student_portrait.sql
| Cột | Kiểu | Ràng buộc / ghi chú |
|---|---|---|
portrait_id | TEXT | NOT NULL REFERENCES portraits(id) |
section_key | TEXT | NOT NULL DEFAULT '_portrait' |
user_id | TEXT | NOT NULL REFERENCES users(id) |
role | TEXT | NOT NULL |
reaction | TEXT | NOT NULL CHECK (reaction IN ('agree','unsure','disagree')) |
created_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| — | table constraint | PRIMARY KEY (portrait_id, section_key, user_id) |
Khóa ngoại: portrait_id → portraits · user_id → users
portrait_tracks
Migration 0017 — Portrait Track (lộ trình dài hạn, vai trò như EPIC trong Jira). SDD-015, REQ-POR-02. Track = thứ chạy xuyên suốt nhiều năm (IELTS, SAT, nền tảng Toán, portfolio...); milestone là các mốc NẰM TRÊN track (thi thử mỗi 6 tháng, thi thật, sản phẩm nộp). portrait_id NULL = track xuyên suốt mọi hướng đi, không thuộc riêng portrait nào.
migration: 0017_portrait_tracks.sql
| Cột | Kiểu | Ràng buộc / ghi chú |
|---|---|---|
id | TEXT | PRIMARY KEY |
learner_id | TEXT | NOT NULL REFERENCES learners(id) |
portrait_id | TEXT | REFERENCES portraits(id) |
name | TEXT | NOT NULL |
kind | TEXT | NOT NULL CHECK (kind IN ('exam','academic','capability','language','habit','portfolio','experience','personal')) |
description | TEXT | — |
icon | TEXT | — |
start_date | TEXT | — |
end_date | TEXT | — |
cadence | TEXT | , -- nhịp lặp, vd "thi thử mỗi 6 tháng" |
baseline_value | TEXT | , -- điểm/mức xuất phát |
target_value | TEXT | , -- đích cuối của cả track |
status | TEXT | NOT NULL DEFAULT 'active' CHECK (status IN ('planned','active','paused','done','dropped')) |
sort_order | INTEGER | NOT NULL DEFAULT 0 |
created_by_user_id | TEXT | NOT NULL |
created_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
updated_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
Khóa ngoại: learner_id → learners · portrait_id → portraits
Index: idx_portrait_tracks_learner(learner_id, status)
portrait_versions
migration: 0011_student_portrait.sql
| Cột | Kiểu | Ràng buộc / ghi chú |
|---|---|---|
id | TEXT | PRIMARY KEY |
portrait_id | TEXT | NOT NULL REFERENCES portraits(id) |
version | INTEGER | NOT NULL |
snapshot_json | TEXT | NOT NULL |
changed_by_user_id | TEXT | NOT NULL |
created_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
Khóa ngoại: portrait_id → portraits
Index: idx_portrait_versions(portrait_id, version)
portraits
Migration 0011 — Student Portrait & Family Future Planning. SDD-015, REQ-POR-01..05 (SRC-040). Comments dùng bảng interactions có sẵn (target_type='portrait'). Idempotent (QG-004).
migration: 0011_student_portrait.sql
| Cột | Kiểu | Ràng buộc / ghi chú |
|---|---|---|
id | TEXT | PRIMARY KEY |
learner_id | TEXT | NOT NULL REFERENCES learners(id) |
created_by_user_id | TEXT | NOT NULL REFERENCES users(id) |
name | TEXT | NOT NULL |
description | TEXT | — |
target_age | INTEGER | — |
target_date | TEXT | — |
cover | TEXT | , -- emoji/màu (ảnh chờ media pipeline — SDD-015 §7) |
sections_json | TEXT | NOT NULL DEFAULT '{}' |
notes | TEXT | — |
status | TEXT | NOT NULL DEFAULT 'active' CHECK (status IN ('active','archived')) |
version | INTEGER | NOT NULL DEFAULT 1 |
created_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
updated_at | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
Khóa ngoại: learner_id → learners · created_by_user_id → users
Index: idx_portraits_learner(learner_id, status)