Tìm kiếm tài liệu...
Mẹo tìm kiếm
Hỏi bằng tiếng Việt. AI sẽ tìm đúng nội dung trong docs cho bạn.

Schema Database (DTI)

Cấu trúc và ý nghĩa các bảng database liên quan đến luồng push dữ liệu từ LMS lên hệ thống DTI.


Tài liệu mô tả các bảng database mà hệ thống DTI sử dụng để lưu trữ dữ liệu push từ LMS. Chỉ bao gồm các bảng liên quan trực tiếp đến luồng push — các bảng phục vụ Dashboard sẽ được bổ sung sau.

1. Tổng quan

LMS Push API
  ├── POST /api/v1/lms/hub/push        → lms_school_stats (chỉ số cấp trường)
  ├── POST /api/v1/lms/hub/push/users  → lms_user_stats   (chỉ số cấp user)
  └── Auto upsert           → lms_school_profiles (metadata trường)

Lookup:
  ├── lms_metric_definitions  (registry metric keys)
  ├── lms_dimension_types     (registry loại dimension)
  ├── lms_dimension_values    (giá trị hợp lệ cho mỗi dimension)
  └── lms_providers           (danh sách NCC LMS)

2. Bảng Raw Data

2.1. lms_school_stats

Bảng fact chính cho chỉ số cấp trường. Mỗi row = 1 giá trị metric tại 1 thời điểm cho 1 trường. Là TimescaleDB hypertable, tối ưu cho time-series data.

ColumnTypeBắt buộcMô tả
idBIGSERIALAutoPK auto-increment
provdoet_codeVARCHAR(10)Mã Sở GD&ĐT
school_codeVARCHAR(50)Mã trường
school_levelVARCHAR(5)Cấp học: 01-05
school_year_codeSMALLINTNăm học: 2025, 2026...
semester_codeSMALLINTHọc kỳ: 1 hoặc 2
metric_keyVARCHAR(100)Mã metric (VD: teacher_accounts)
dim_valueVARCHAR(100)Giá trị dimension. Default ''. VD: mobile, video
subject_codeVARCHAR(4)KhôngMã chương trình môn học (tối đa 4 ký tự số). VD: 0101
grade_codeVARCHAR(2)KhôngMã khối/lớp (2 ký tự số). VD: 09 = Khối 9
valueNUMERICGiá trị metric
measured_atTIMESTAMPTZThời điểm đo (do LMS gửi)
received_atTIMESTAMPTZAutoThời điểm server nhận, default NOW()
etl_statusVARCHAR(10)Autopendingprocessed. ETL worker đọc pending rows

Đặc tính TimescaleDB:

  • Hypertable: chunk interval = 1 ngày trên measured_at
  • Columnstore compression: tự động sau 3 ngày
  • Indexes: (school_code, metric_key, dim_value, measured_at DESC), (school_code, metric_key, subject_code, measured_at DESC), partial index trên etl_status = 'pending'

2.2. lms_user_stats

Bảng fact cho chỉ số cấp người dùng (GV/HS). Cấu trúc giống lms_school_stats nhưng thêm user_pin và chunk interval lớn hơn do volume cao.

ColumnTypeBắt buộcMô tả
idBIGSERIALAutoPK auto-increment
provdoet_codeVARCHAR(10)Mã Sở GD&ĐT
school_codeVARCHAR(50)Mã trường
school_levelVARCHAR(5)Cấp học: 01-05
school_year_codeSMALLINTNăm học
semester_codeSMALLINTHọc kỳ: 1 hoặc 2
user_pinVARCHAR(100)Mã định danh người dùng trên LMS
metric_keyVARCHAR(100)Mã metric
dim_valueVARCHAR(100)Giá trị dimension. Default ''
subject_codeVARCHAR(4)KhôngMã chương trình môn học (tối đa 4 ký tự số). VD: 0101
grade_codeVARCHAR(2)KhôngMã khối/lớp (2 ký tự số). VD: 09 = Khối 9
valueNUMERICGiá trị metric
measured_atTIMESTAMPTZThời điểm đo
received_atTIMESTAMPTZAutoDefault NOW()
etl_statusVARCHAR(10)Autopendingprocessed

Đặc tính TimescaleDB:

  • Hypertable: chunk interval = 7 ngày trên measured_at
  • Columnstore compression: tự động sau 7 ngày
  • Indexes: (school_code, user_pin, metric_key, measured_at DESC), (school_code, metric_key, subject_code, measured_at DESC), partial index trên etl_status = 'pending'

2.3. lms_school_profiles

Metadata trường học. Tự động upsert khi LMS push. Phục vụ tra cứu và group by cấp học/địa phương trên Dashboard.

ColumnTypeBắt buộcMô tả
idUUIDAutoPK
provdoet_codeVARCHAR(10)Mã Sở GD&ĐT
school_codeVARCHAR(50)Mã trường
school_levelVARCHAR(5)Cấp học: 01-05
school_year_codeSMALLINTNăm học
has_lmsBOOLEANTrường có sử dụng LMS không. Default false
provider_idUUID FKKhônglms_providers
division_codeVARCHAR(20)KhôngMã xã/phường
start_dateDATEKhôngNgày bắt đầu sử dụng LMS
created_atTIMESTAMPTZAuto
updated_atTIMESTAMPTZAuto

Unique constraint: (provdoet_code, school_code, school_level, school_year_code) — bộ 4 giá trị xác định duy nhất 1 trường.

3. Bảng Definitions

3.1. lms_metric_definitions

Registry tất cả metric keys. LMS đọc qua API GET /api/v1/lms/hub/metrics/push-config để biết cần push những chỉ số nào.

ColumnTypeMô tả
idUUID PK
keyVARCHAR(100) UNIQUEMã metric (VD: total_lessons, teacher_accounts)
nameVARCHAR(200)Tên hiển thị
unitVARCHAR(50)Đơn vị: lessons, accounts, %, GB, minutes...
value_typeENUMcumulative (tích lũy) hoặc gauge (snapshot)
push_intervalVARCHAR(20)Tần suất push: 1 hour, 1 day, 1 week, 1 month
dim_typeVARCHAR(50)Loại dimension nếu có (VD: device, content_type). NULL = không có
target_roleVARCHAR(20)Đối tượng: teacher, student, hoặc NULL (cấp trường)
sourceVARCHAR(20)push (LMS gửi) hoặc computed (ETL tính). Default push
descriptionTEXTMô tả chi tiết
is_activeBOOLEANMetric bị deactivate sẽ bị reject khi push

3.2. lms_dimension_types

Registry loại dimension. Dùng cho labels hiển thị và validation.

ColumnTypeMô tả
idUUID PK
keyVARCHAR(50) UNIQUEcontent_type, grade_code, subject, device, school_level
nameVARCHAR(200)Tên hiển thị (VD: Loại bài giảng, Khối lớp)
descriptionTEXT
is_activeBOOLEAN

3.3. lms_dimension_values

Giá trị hợp lệ cho mỗi dimension type. Frontend dùng để hiển thị label tiếng Việt.

ColumnTypeMô tả
idUUID PK
dim_type_idUUID FKlms_dimension_types
codeVARCHAR(100)Mã giá trị (VD: video, 01, mobile)
labelVARCHAR(200)Label hiển thị (VD: Video, Khối 1, Mobile)
sort_orderINTThứ tự sắp xếp
is_activeBOOLEAN

Unique constraint: (dim_type_id, code)

Dữ liệu đã seed:

Dimension typeSố valuesVí dụ
content_type8content, video, audio, document, scorm, iframe, test, interactive_video
grade_code1201 → 12 (Khối 1 → Khối 12)
device3mobile, pc, tablet
school_level501 Mầm non, 02 Tiểu học, 03 THCS, 04 THPT, 05 GDTX
subjectLMS tự gửi mã riêng (không seed sẵn)

3.4. lms_providers

Danh sách nhà cung cấp LMS.

ColumnTypeMô tả
idUUID PK
nameVARCHAR(200)Tên NCC (VD: VnEdu, OLM, Edmicro)
codeVARCHAR(50) UNIQUEMã NCC
is_activeBOOLEAN

4. Quan hệ giữa các bảng

lms_providers
  └──< lms_school_profiles.provider_id

lms_metric_definitions.key
  └── được dùng trong lms_school_stats.metric_key
  └── được dùng trong lms_user_stats.metric_key

lms_dimension_types
  └──< lms_dimension_values.dim_type_id
  └── lms_metric_definitions.dim_type → tham chiếu bằng key (không FK)

lms_school_profiles
  └── tự động upsert khi push (provdoet_code + school_code + school_level + school_year_code)

Lưu ý: lms_school_statslms_user_stats tham chiếu metric_key bằng giá trị string (không dùng FK UUID) để tối ưu insert performance trên hypertable.