Tìm kiếm tài liệu...

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)CóMã Sở GD&ĐT
school_codeVARCHAR(50)CóMã trường
school_levelVARCHAR(5)CóCấp học: 01-05
school_year_codeSMALLINTCóNăm học: 2025, 2026...
semester_codeSMALLINTCóHọc kỳ: 1 hoặc 2
metric_keyVARCHAR(100)CóMã metric (VD: teacher_accounts)
dim_valueVARCHAR(100)Có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
valueNUMERICCóGiá trị metric
measured_atTIMESTAMPTZCóThời điểm đo (do LMS gửi)
received_atTIMESTAMPTZAutoThời điểm server nhận, default NOW()
etl_statusVARCHAR(10)Autopending → processed. 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)CóMã Sở GD&ĐT
school_codeVARCHAR(50)CóMã trường
school_levelVARCHAR(5)CóCấp học: 01-05
school_year_codeSMALLINTCóNăm học
semester_codeSMALLINTCóHọc kỳ: 1 hoặc 2
user_pinVARCHAR(100)CóMã định danh người dùng trên LMS
metric_keyVARCHAR(100)CóMã metric
dim_valueVARCHAR(100)Có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
valueNUMERICCóGiá trị metric
measured_atTIMESTAMPTZCóThời điểm đo
received_atTIMESTAMPTZAutoDefault NOW()
etl_statusVARCHAR(10)Autopending → processed

Đặ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)CóMã Sở GD&ĐT
school_codeVARCHAR(50)CóMã trường
school_levelVARCHAR(5)CóCấp học: 01-05
school_year_codeSMALLINTCóNăm học
has_lmsBOOLEANCóTrường có sử dụng LMS không. Default false
provider_idUUID FKKhông→ lms_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 FK→ lms_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
subject—LMS 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_stats và lms_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.