Перейти к основному содержимому

Data mapping — lms

Источники

  • GetCourse: курсы, уроки, прогресс, домашки;
  • ручные таблицы расписаний и attendance;
  • Laravel-сайт roadmap (программа обучения, темы);
  • ручные таблицы преподавателей и групп;
  • старые группы преподавателей из олимпиадного контура, если они использовались как постоянный учебный roster;
  • ручные тетради/проекты (если есть структура).

Mapping сущностей

Исходная сущностьЦелевая сущностьПравило
GetCourse courselms_course + lms_course_versionодна версия на курс при импорте
GetCourse lessonlms_node (type=lesson) + lms_content_blockпарсинг контента в блоки
GetCourse activity/testlms_activitymapping типа активности
GetCourse student progresslms_progress_snapshot, lms_activity_attemptпо пользователю и активности
GetCourse homeworklms_homework + lms_submissionсохраняем оценки и feedback
Laravel roadmap программаroadmap_program, roadmap_module, roadmap_topicпересборка иерархии
Storefront/admin roadmap authoringroadmap_program, roadmap_module, roadmap_topic, topic_pathwayнормализация учебной модели в LMS; editorial-поля остаются во storefront
Laravel topic ↔ course/lessontopic_pathway + session_topic_linkявные связи
Product/course linkagetopic_pathway.product_refs, product_run_refsCRM refs, не ownership transfer
Legacy group/session schedulegroup, session, session_topic_link, mini_group_trackscheduled state строится в LMS projection
Sheets преподавателиlms_teacher_assignment + ссылка на educator_profileeducator_profile создаётся/сверяется в identity, LMS хранит учебное назначение
Sheets группыlearning_groupcanonical roster «мои группы»
Sheets участники группlearning_group_participantcanonical roster «мои ученики»
Sheets занятияsession+ attendance
Sheets attendanceattendanceper session, per student
ручные тетрадиlms_workbookодин на ученика-курс
ручные XP/streakxp_event агрегатыодна история начисления
старые олимпиадные teacher groupslearning_group + learning_group_participantтолько если группа использовалась за пределами одного сезона
результаты олимпиад для разбораlearning_evidence / learning_review_sessionsource ref на competition_result; не training attempt

Маппинг статусов

Исходный attendanceЦелевой attendance
пусто / not_markedexpected
presentpresent
absentabsent
latelate
excusedexcused_absence
makeupmakeup_completed
cancelledcancelled

Если legacy makeup означает только запланированную компенсацию, а не факт проведённого replacement-занятия, запись переносится как makeup_planned.

Сценарии

  • курсы переносятся по одному, в порядке приоритета продаж;
  • активные ученики получают enrollment в целевом LMS, прогресс backfill ETL;
  • расписание сначала зеркалится, затем переключается на запись в целевой LMS;
  • attendance параллельно фиксируется в обеих системах в фазе dual-write;
  • топика дорожной карты пересобираются и проверяются куратором;
  • public roadmap из storefront/admin импортируется в LMS как normalised roadmap, а entry_requirements, catchup, CTA и SEO copy остаются storefront projection;
  • преподавательские списки из старых таблиц и олимпиад переносятся в Learning Workspace, а не в competitions.

Стратегия

    1. read-only ETL прогресса из GetCourse;
    1. dual-write: новые активности — в целевой LMS;
    1. per-course cutover;
    1. ручные таблицы отключаются по группам;
    1. Learning Workspace становится единственным источником «мои ученики / мои группы»;
    1. write switch — новые продажи только в целевой LMS.

Риски и контроль

  • утрата прогресса → ETL валидируется по контрольным суммам активностей;
  • путаница в связях course ↔ topic → curriculum-команда подтверждает связи;
  • расхождение расписания → ежедневный delta-check;
  • путаница в XP → исторические XP импортируются как один агрегат xp_event с типом source_aggregate.
  • смешение learning_training_attempt и competition_submission → отдельные namespace и source refs.

Связанные документы