offdataai
Education · data model template

Learning Management System data model

Normalized (3NF) LMS model. Instructors author courses broken into modules and lessons; learners enroll and progress, submitting assignments that receive grades and taking quizzes that record attempts, culminating in certificates. Learner education records (grades, scores, feedback) are FERPA-classified and masked.

Learning management system operations: learners and instructors, the course/module/lesson content hierarchy, enrollments and progress, assessable work (assignments, submissions, and grades), quizzes and attempts, and issued certificates — modeled as a normalized OLTP learning platform schema with FERPA-protected education records classified and masked. It is a normalized (3NF) relational model that mirrors the source system, suited to operational databases and to landing source data faithfully.

3NFEducationFERPAGDPR
13
tables
113
columns
15
relationships
8
PII columns

Opening the template creates a project with the ERD, platform-native DDL, a dbt project and documentation already generated (recommended platform: PostgreSQL). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

peoplecontentenrollment_and_progressassessment

Design decisions

  • Course / module / lesson content hierarchy

    Structuring content as course to module to lesson mirrors how LMS platforms (e.g. Canvas, Moodle) organize curriculum and keeps sequencing and reuse normalized.

  • Submission and grade separated from assignment

    An assignment is the task definition while submissions are per-learner attempts and grades are the assessed outcomes; keeping them distinct supports resubmission, late penalties, and re-grading.

  • FERPA classification on education records

    Grades, quiz scores, and instructor feedback are protected education records under FERPA, so they are classified confidential and masked by default.

  • Normalized (3NF) rather than dimensional

    LMS activity is transactional — enrollments, submissions, and attempts are continuously written and updated — favoring relational integrity over analytical roll-ups.

Tables in the Learning Management System model

Every table with its grain, columns, types and keys. PK marks a primary key, BK a business key and PII a column classified as personal data, which gets a masking strategy by default.

Tables (12)

learner

Grain: one row per learner/student

Student account; FERPA-protected education record.

ColumnTypeKeys
learner_keybigintPK
learner_numbervarcharBK
first_namevarcharPII
last_namevarcharPII
emailvarcharPII
date_of_birthdatePII
phonevarcharPII
countryvarchar
timezonevarchar
statusvarchar
enrolled_datedate

instructor

Grain: one row per instructor

Teaching staff.

ColumnTypeKeys
instructor_keybigintPK
instructor_numbervarcharBK
first_namevarcharPII
last_namevarcharPII
emailvarcharPII
titlevarchar
departmentvarchar
biovarchar
hire_datedate
is_activeboolean

course

Grain: one row per course

Catalog course.

ColumnTypeKeys
course_keybigintPK
instructor_keybigint
course_codevarcharBK
titlevarchar
descriptionvarchar
subject_areavarchar
levelvarchar
credit_hoursdecimal
languagevarchar
is_publishedboolean
created_attimestamp

module

Grain: one row per module within a course

Course unit.

ColumnTypeKeys
module_keybigintPK
course_keybigint
module_codevarcharBK
titlevarchar
sequence_numberinteger
descriptionvarchar
is_requiredboolean

lesson

Grain: one row per lesson within a module

Lesson content.

ColumnTypeKeys
lesson_keybigintPK
module_keybigint
lesson_codevarcharBK
titlevarchar
sequence_numberinteger
content_typevarchar
content_urlvarchar
duration_minutesinteger

enrollment

Grain: one row per learner enrolled in a course

Learner-course registration.

ColumnTypeKeys
enrollment_keybigintPK
learner_keybigint
course_keybigint
enrollment_numbervarcharBK
enrolled_attimestamp
completion_percentagedecimal
final_gradevarchar
statusvarchar
completed_attimestamp

assignment

Grain: one row per assignment in a course

Graded task definition.

ColumnTypeKeys
assignment_keybigintPK
course_keybigint
module_keybigint
assignment_codevarcharBK
titlevarchar
descriptionvarchar
max_pointsdecimal
weight_percentagedecimal
due_datetimestamp
is_publishedboolean

submission

Grain: one row per learner submission to an assignment

Submitted work.

ColumnTypeKeys
submission_keybigintPK
assignment_keybigint
enrollment_keybigint
submission_numbervarcharBK
attempt_numbersmallint
content_urlvarchar
submitted_attimestamp
is_lateboolean
statusvarchar

grade

Grain: one row per grade for a submission

Assessment outcome; FERPA-protected.

ColumnTypeKeys
grade_keybigintPK
submission_keybigint
instructor_keybigint
points_earneddecimal
points_possibledecimal
letter_gradevarchar
feedbackvarchar
graded_attimestamp

quiz

Grain: one row per quiz

Assessment quiz.

ColumnTypeKeys
quiz_keybigintPK
lesson_keybigint
quiz_codevarcharBK
titlevarchar
question_countsmallint
max_pointsdecimal
time_limit_minutesinteger
max_attemptssmallint
passing_scoredecimal

quiz_attempt

Grain: one row per learner attempt at a quiz

Quiz attempt; FERPA-protected.

ColumnTypeKeys
quiz_attempt_keybigintPK
quiz_keybigint
enrollment_keybigint
attempt_numbersmallint
scoredecimal
is_passedboolean
started_attimestamp
submitted_attimestamp
duration_secondsinteger

certificate

Grain: one row per issued certificate

Completion credential.

ColumnTypeKeys
certificate_keybigintPK
enrollment_keybigint
certificate_numbervarcharBK
titlevarchar
issued_datedate
expiry_datedate
verification_codevarchar
statusvarchar

Lookup tables (1)

content_type_ref

Grain: static reference of lesson content types

Content-type reference.

ColumnTypeKeys
content_type_keybigintPK
type_codevarcharBK
type_namevarchar
descriptionvarchar

Relationships

Each relationship is a foreign key on the first table referencing the second.

  • course.instructor_key → instructor (many-to-one)
  • module.course_key → course (many-to-one)
  • lesson.module_key → module (many-to-one)
  • enrollment.learner_key → learner (many-to-one)
  • enrollment.course_key → course (many-to-one)
  • assignment.course_key → course (many-to-one)
  • assignment.module_key → module (many-to-one)
  • submission.assignment_key → assignment (many-to-one)
  • submission.enrollment_key → enrollment (many-to-one)
  • grade.submission_key → submission (many-to-one)
  • grade.instructor_key → instructor (many-to-one)
  • quiz.lesson_key → lesson (many-to-one)
  • quiz_attempt.quiz_key → quiz (many-to-one)
  • quiz_attempt.enrollment_key → enrollment (many-to-one)
  • certificate.enrollment_key → enrollment (many-to-one)

Related templates

All templates →
Start for $1

From requirements to AI-ready context, in one platform.

Describe your business in a conversation, start from a template or connect your own database. Your first model is ready in minutes.

Get startedBook a demo

Plans from $1/month · cancel any time