Education
Education
Learning platform with courses, lessons, progress tracking, and certificates.
8 tables in this group.
courses
Course catalog for trading education platform with beginner/intermediate/advanced tracks
| Column | Type | Nullable | Default |
|---|---|---|---|
id | uuid | No | gen_random_uuid() |
title | varchar(255) | No | |
slug | varchar(255) | No | |
description | text | Yes | |
difficulty | difficulty_level | No | 'beginner'::difficulty_level |
duration_minutes | int4 | Yes | 0 |
estimated_completion_time | varchar(50) | Yes | |
thumbnail_url | text | Yes | |
preview_video_url | text | Yes | |
instructor_name | varchar(255) | Yes | |
instructor_bio | text | Yes | |
instructor_avatar_url | text | Yes | |
is_published | bool | No | false |
is_featured | bool | No | false |
display_order | int4 | Yes | 0 |
category | varchar(100) | Yes | |
tags | _text | Yes | ARRAY[]::text[] |
learning_objectives | _text | Yes | ARRAY[]::text[] |
prerequisites | _text | Yes | ARRAY[]::text[] |
total_lessons | int4 | Yes | 0 |
total_enrollments | int4 | Yes | 0 |
average_rating | numeric | Yes | 0.0 |
metadata | jsonb | Yes | '{}'::jsonb |
created_at | timestamptz | No | now() |
updated_at | timestamptz | No | now() |
published_at | timestamptz | Yes |
RLS Policies:
rls_courses_delete_service— DELETE for {service_role}rls_courses_insert_service— INSERT for {service_role}rls_courses_select_public— SELECT for {authenticated}rls_courses_select_service— SELECT for {service_role}rls_courses_update_service— UPDATE for {service_role}
Indexes:
courses_pkeycourses_slug_keyidx_courses_categoryidx_courses_difficultyidx_courses_display_orderidx_courses_featuredidx_courses_publishedidx_courses_slug
course_modules
Organizational structure dividing courses into modules
| Column | Type | Nullable | Default |
|---|---|---|---|
id | uuid | No | gen_random_uuid() |
course_id | uuid | No | |
title | varchar(255) | No | |
description | text | Yes | |
module_order | int4 | No | 0 |
duration_minutes | int4 | Yes | 0 |
is_optional | bool | No | false |
created_at | timestamptz | No | now() |
updated_at | timestamptz | No | now() |
RLS Policies:
rls_course_modules_delete_service— DELETE for {service_role}rls_course_modules_insert_service— INSERT for {service_role}rls_course_modules_select_public— SELECT for {authenticated}rls_course_modules_select_service— SELECT for {service_role}rls_course_modules_update_service— UPDATE for {service_role}
Indexes:
course_modules_course_order_uniquecourse_modules_pkeyidx_course_modules_course_ididx_course_modules_order
lessons
Individual learning units within course modules
| Column | Type | Nullable | Default |
|---|---|---|---|
id | uuid | No | gen_random_uuid() |
module_id | uuid | No | |
title | varchar(255) | No | |
description | text | Yes | |
lesson_order | int4 | No | 0 |
duration_minutes | int4 | Yes | 0 |
is_preview | bool | No | false |
summary | text | Yes | |
metadata | jsonb | Yes | '{}'::jsonb |
created_at | timestamptz | No | now() |
updated_at | timestamptz | No | now() |
RLS Policies:
rls_lessons_delete_service— DELETE for {service_role}rls_lessons_insert_service— INSERT for {service_role}rls_lessons_select_public— SELECT for {authenticated}rls_lessons_select_service— SELECT for {service_role}rls_lessons_update_service— UPDATE for {service_role}
Indexes:
idx_lessons_module_ididx_lessons_orderidx_lessons_previewlessons_module_order_uniquelessons_pkey
lesson_content
Multi-format content items (video, text, quiz) for lessons
| Column | Type | Nullable | Default |
|---|---|---|---|
id | uuid | No | gen_random_uuid() |
lesson_id | uuid | No | |
content_type | content_type | No | |
title | varchar(255) | Yes | |
content | text | Yes | |
video_url | text | Yes | |
resource_url | text | Yes | |
content_order | int4 | No | 0 |
duration_seconds | int4 | Yes | |
quiz_data | jsonb | Yes | |
interactive_config | jsonb | Yes | |
metadata | jsonb | Yes | '{}'::jsonb |
created_at | timestamptz | No | now() |
updated_at | timestamptz | No | now() |
RLS Policies:
rls_lesson_content_delete_service— DELETE for {service_role}rls_lesson_content_insert_service— INSERT for {service_role}rls_lesson_content_select_public— SELECT for {authenticated}rls_lesson_content_select_service— SELECT for {service_role}rls_lesson_content_update_service— UPDATE for {service_role}
Indexes:
idx_lesson_content_lesson_ididx_lesson_content_orderidx_lesson_content_typelesson_content_lesson_order_uniquelesson_content_pkey
user_progress
User progress tracking for lessons and content completion
| Column | Type | Nullable | Default |
|---|---|---|---|
id | uuid | No | gen_random_uuid() |
user_id | uuid | No | |
course_id | uuid | No | |
lesson_id | uuid | Yes | |
content_id | uuid | Yes | |
status | completion_status | No | 'not_started'::completion_status |
progress_percentage | int4 | Yes | 0 |
video_position_seconds | int4 | Yes | 0 |
quiz_score | int4 | Yes | |
quiz_attempts | int4 | Yes | 0 |
quiz_passed | bool | Yes | false |
completed_at | timestamptz | Yes | |
time_spent_minutes | int4 | Yes | 0 |
user_notes | text | Yes | |
is_bookmarked | bool | No | false |
metadata | jsonb | Yes | '{}'::jsonb |
created_at | timestamptz | No | now() |
updated_at | timestamptz | No | now() |
RLS Policies:
rls_user_progress_delete— DELETE for {authenticated}rls_user_progress_insert— INSERT for {authenticated}rls_user_progress_select— SELECT for {authenticated}rls_user_progress_service— ALL for {service_role}rls_user_progress_update— UPDATE for {authenticated}
Indexes:
idx_user_progress_bookmarkedidx_user_progress_course_ididx_user_progress_lesson_ididx_user_progress_statusidx_user_progress_user_courseidx_user_progress_user_iduser_progress_pkeyuser_progress_user_lesson_unique
certificates
User completion certificates with verification codes and public verification
| Column | Type | Nullable | Default |
|---|---|---|---|
id | uuid | No | gen_random_uuid() |
user_id | uuid | No | |
course_id | uuid | No | |
verification_code | varchar(64) | No | |
issue_date | timestamptz | No | now() |
recipient_name | varchar(255) | No | |
course_title | varchar(255) | No | |
course_difficulty | difficulty_level | No | |
completion_date | timestamptz | No | |
total_time_spent_minutes | int4 | Yes | 0 |
total_lessons_completed | int4 | Yes | 0 |
final_score | int4 | Yes | |
certificate_template | varchar(50) | Yes | 'default'::character varying |
certificate_number | varchar(50) | No | |
instructor_name | varchar(255) | Yes | |
instructor_signature_url | text | Yes | |
certificate_pdf_url | text | Yes | |
verification_url | text | Yes | |
qr_code_url | text | Yes | |
is_revoked | bool | No | false |
revocation_reason | text | Yes | |
revoked_at | timestamptz | Yes | |
revoked_by | uuid | Yes | |
is_public | bool | No | true |
shared_count | int4 | Yes | 0 |
metadata | jsonb | Yes | '{}'::jsonb |
created_at | timestamptz | No | now() |
updated_at | timestamptz | No | now() |
RLS Policies:
rls_certificates_delete_service— DELETE for {service_role}rls_certificates_insert_service— INSERT for {service_role}rls_certificates_select— SELECT for {authenticated}rls_certificates_update_service— UPDATE for {service_role}rls_certificates_verify_public— SELECT for {anon}
Indexes:
certificates_certificate_number_keycertificates_pkeycertificates_user_course_uniquecertificates_verification_code_keyidx_certificates_certificate_numberidx_certificates_course_ididx_certificates_issue_dateidx_certificates_publicidx_certificates_revokedidx_certificates_user_activeidx_certificates_user_ididx_certificates_verification_code
tutorials
Interactive platform tutorials with step-by-step guided tours
| Column | Type | Nullable | Default |
|---|---|---|---|
id | uuid | No | gen_random_uuid() |
title | varchar(255) | No | |
slug | varchar(255) | No | |
description | text | Yes | |
category | tutorial_category | No | 'getting_started'::tutorial_category |
difficulty | difficulty_level | No | 'beginner'::difficulty_level |
estimated_duration_minutes | int4 | Yes | 5 |
thumbnail_url | text | Yes | |
icon | varchar(50) | Yes | |
display_order | int4 | Yes | 0 |
is_published | bool | No | false |
is_recommended | bool | No | false |
prerequisite_tutorial_ids | _uuid | Yes | ARRAY[]::uuid[] |
required_feature_flags | _text | Yes | ARRAY[]::text[] |
steps | jsonb | No | '[]'::jsonb |
target_route | varchar(255) | Yes | |
required_route_params | jsonb | Yes | '{}'::jsonb |
auto_trigger_on_first_visit | bool | No | false |
auto_trigger_conditions | jsonb | Yes | '{}'::jsonb |
total_steps | int4 | Yes | 0 |
completion_count | int4 | Yes | 0 |
skip_count | int4 | Yes | 0 |
average_completion_time_minutes | numeric | Yes | 0.0 |
tags | _text | Yes | ARRAY[]::text[] |
metadata | jsonb | Yes | '{}'::jsonb |
created_at | timestamptz | No | now() |
updated_at | timestamptz | No | now() |
published_at | timestamptz | Yes |
RLS Policies:
rls_tutorials_delete_service— DELETE for {service_role}rls_tutorials_insert_service— INSERT for {service_role}rls_tutorials_select_public— SELECT for {authenticated}rls_tutorials_select_service— SELECT for {service_role}rls_tutorials_update_service— UPDATE for {service_role}
Indexes:
idx_tutorials_categoryidx_tutorials_difficultyidx_tutorials_display_orderidx_tutorials_publishedidx_tutorials_recommendedidx_tutorials_slugidx_tutorials_target_routetutorials_pkeytutorials_slug_key
user_tutorial_progress
User progress tracking for interactive tutorials
| Column | Type | Nullable | Default |
|---|---|---|---|
id | uuid | No | gen_random_uuid() |
user_id | uuid | No | |
tutorial_id | uuid | No | |
status | tutorial_status | No | 'not_started'::tutorial_status |
current_step_number | int4 | Yes | 1 |
total_steps_completed | int4 | Yes | 0 |
started_at | timestamptz | Yes | |
completed_at | timestamptz | Yes | |
last_accessed_at | timestamptz | Yes | |
time_spent_minutes | int4 | Yes | 0 |
steps_skipped | int4 | Yes | 0 |
times_restarted | int4 | Yes | 0 |
was_helpful | bool | Yes | |
feedback_rating | int4 | Yes | |
feedback_comment | text | Yes | |
metadata | jsonb | Yes | '{}'::jsonb |
created_at | timestamptz | No | now() |
updated_at | timestamptz | No | now() |
RLS Policies:
rls_user_tutorial_progress_delete— DELETE for {authenticated}rls_user_tutorial_progress_insert— INSERT for {authenticated}rls_user_tutorial_progress_select— SELECT for {authenticated}rls_user_tutorial_progress_service— ALL for {service_role}rls_user_tutorial_progress_update— UPDATE for {authenticated}
Indexes:
idx_user_tutorial_progress_completedidx_user_tutorial_progress_statusidx_user_tutorial_progress_tutorial_ididx_user_tutorial_progress_user_ididx_user_tutorial_progress_user_tutorialuser_tutorial_progress_pkeyuser_tutorial_progress_user_tutorial_unique