Target data model
Core schema created in this phase. All business tables are empty until imports are approved. Custom modules are added after code review.
Organizations
organizations
root
org_units
→ organizations, → org_units (parent)
Identity & users
app_users
legacy_moodle_user_id unique
user_profiles
1:1 → app_users
external_identity_links
→ app_users; unique (issuer, subject)
user_org_memberships
→ app_users, organizations, org_units
Courses
course_categories
→ course_categories (parent), organizations
courses
→ course_categories, organizations
course_units
→ courses; unique (course, position)
learning_activities
→ courses, course_units; legacy module + instance
Enrolment & roles
enrolment_sources
→ courses
course_enrolments
→ enrolment_sources, app_users
user_course_roles
→ app_users, courses
Progress & grades
course_completions
→ app_users, courses
activity_completions
→ app_users, learning_activities
grade_items
→ courses, learning_activities
grades
→ grade_items, app_users
Assessments
assessments
1:1 → learning_activities
questions
versioned
attempts
→ assessments, app_users; unique attempt number
attempt_steps
→ attempts, questions; full step history
Credentials & files
credential_templates
→ courses
issued_credentials
→ credential_templates, app_users, file_assets; unique number
file_assets
content hash + SHA-256; private by default
file_links
→ file_assets; owner/context + file area
Migration control
migration_plan_steps
dependency order
migration_jobs
→ migration_plan_steps; guarded state machine
migration_exceptions
→ migration_jobs
legacy_crosswalk
→ migration_jobs; unique (source_table, source_id)
reconciliation_checks
sign-off
audit_log
written by triggers