elearning/docs/api-docs/ERD_README.md

313 lines
6.6 KiB
Markdown
Raw Normal View History

# Database Schema (ERD) Documentation
## 📊 Entity-Relationship Diagram
### Online Visualization
View the interactive ERD diagram:
- **dbdiagram.io**: [dbdiagram.io](https://dbdiagram.io/d/e-lerning-6943c64be4bb1dd3a9896479)
## 📋 Database Overview
### Total Tables: **17**
| Category | Tables | Count |
|----------|--------|-------|
| **Core** | users, categories, courses, chapters, lessons | 5 |
| **Content** | quizzes, questions, choices, lesson_attachments | 4 |
| **Progress** | enrollments, lesson_progress, quiz_attempts | 3 |
| **Communication** | announcements, announcement_attachments | 2 |
| **Commerce** (อนาคต) | orders, payments, withdrawals | 3 |
---
## 🎯 Key Features
### 1. **Multi-language Support**
- Uses `jsonb` fields for Thai/English content
- Fields: `title`, `content`, `description`
### 2. **Video Progress Tracking**
- Track playback position per student
- Auto-complete at 90% watched
- Resume from last position
### 3. **Lesson Prerequisites**
- Sequential learning control
- Quiz pass requirements
- Flexible ordering
### 4. **File Attachments**
- Multiple files per lesson
- Support for PDF, DOCX, ZIP, images
- Sortable with descriptions
### 5. **Quiz System**
- Multiple attempts with cooldown
- Score policies (HIGHEST/LATEST/FIRST/AVERAGE)
- Detailed attempt history
---
## 📊 Main Entities
### Users
- Roles: STUDENT, INSTRUCTOR, ADMIN
- Profile information
- Authentication data
### Courses
- Multi-language titles and descriptions
- Categories and pricing
- Instructor ownership
- Approval workflow
### Chapters & Lessons
- Hierarchical structure
- Sort ordering
- Multiple lesson types (video, pdf, text, quiz)
- Prerequisites support
### Progress Tracking
- Enrollment status
- Lesson completion
- Video playback position
- Quiz attempts and scores
---
## 🔗 Relationships
```
users (1) ──── (many) courses [instructor]
users (1) ──── (many) enrollments
users (1) ──── (many) lesson_progress
users (1) ──── (many) quiz_attempts
courses (1) ──── (many) chapters
courses (1) ──── (many) enrollments
courses (1) ──── (many) announcements
chapters (1) ──── (many) lessons
lessons (1) ──── (many) lesson_attachments
lessons (1) ──── (many) lesson_progress
lessons (1) ──── (many) quizzes
quizzes (1) ──── (many) questions
quizzes (1) ──── (many) quiz_attempts
questions (1) ──── (many) choices
```
---
## 🎨 How to Visualize
### Using dbdiagram.io
1. **Open dbdiagram.io**
- Go to [https://dbdiagram.io/d](https://dbdiagram.io/d)
2. **Import Schema**
- Click "Import" button (top right)
- Select "From DBML"
- Copy contents from [`ERD_v2_improved.txt`](./ERD_v2_improved.txt)
- Paste into the editor
- Click "Import"
3. **View Diagram**
- Zoom in/out with mouse wheel
- Drag to pan
- Click tables to highlight relationships
- Export as PNG/PDF/SQL
### Alternative Tools
- **DBeaver**: Import SQL and generate ER diagram
- **MySQL Workbench**: Reverse engineer from database
- **pgAdmin**: PostgreSQL schema visualization
- **draw.io**: Manual diagram creation
---
## 📝 Table Descriptions
### Core Tables
#### `users`
- User accounts and authentication
- Roles: STUDENT, INSTRUCTOR, ADMIN
- Profile information
#### `categories`
- Course categorization
- Multi-language names
#### `courses`
- Course information and metadata
- Pricing and approval status
- Instructor ownership
#### `chapters`
- Course structure organization
- Sortable within courses
#### `lessons`
- Learning content units
- Types: video, pdf, text, quiz
- Prerequisites and sequencing
### Content Tables
#### `quizzes`
- Assessment configuration
- Attempt limits and cooldown
- Passing score requirements
#### `questions`
- Quiz questions
- Types: multiple_choice, true_false
- Point values
#### `choices`
- Answer options for questions
- Correct answer marking
#### `lesson_attachments`
- Supplementary files
- PDFs, documents, code samples
- Multi-language descriptions
### Progress Tables
#### `enrollments`
- Student course registrations
- Progress tracking
- Certificate issuance
#### `lesson_progress`
- Lesson completion status
- Video playback position
- Watch history
#### `quiz_attempts`
- Quiz submission records
- Scores and answers
- Attempt history
### Communication Tables
#### `announcements`
- Course announcements
- Pinning and scheduling
- Multi-language content
#### `announcement_attachments`
- Announcement file attachments
---
## 🔧 Database Constraints
### Primary Keys
- All tables use auto-incrementing integer PKs
### Foreign Keys
- Maintain referential integrity
- Cascade deletes where appropriate
### Unique Constraints
- `(user_id, course_id)` in enrollments
- `(user_id, lesson_id)` in lesson_progress
- Email in users
### Check Constraints (via notes)
- Progress percentages: 0-100
- Scores: 0-100
- Sort orders: >= 0
- Prices: >= 0
### Indexes
- Single column indexes on FKs
- Composite indexes for common queries
- JSONB GIN indexes for multi-language fields
---
## 🚀 Migration Notes
### PostgreSQL Extensions Required
```sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- for text search
```
### JSONB Usage
```sql
-- Multi-language fields
title JSONB -- {"th": "...", "en": "..."}
-- Query examples
WHERE title->>'th' LIKE '%Python%'
WHERE title @> '{"en": "Introduction"}'
```
### Soft Delete Pattern
```sql
-- Recommended for important tables
ALTER TABLE courses ADD COLUMN deleted_at TIMESTAMP;
CREATE INDEX idx_courses_deleted ON courses(deleted_at) WHERE deleted_at IS NULL;
```
---
## 📈 Performance Considerations
### Indexes Created
- All foreign keys
- Composite indexes for (course_id, sort_order)
- User email for login
- Course status for filtering
- Last watched timestamp for recent videos
### Query Optimization
- Use `SELECT` specific columns
- Implement pagination
- Cache course lists in Redis
- Use database views for complex queries
---
## 🔗 Related Documentation
- [API Endpoints](./api_endpoints.md) - REST API reference
- [Edge Cases](../edge_cases_quick_reference.md) - Special scenarios
- [Development Setup](../development_setup.md) - Environment configuration
---
## 📊 Statistics
- **Total Tables**: 17
- **Total Relationships**: 20+
- **Multi-language Fields**: 15+
- **Indexed Columns**: 40+
- **JSONB Fields**: 15+
---
## 🎯 Next Steps
1. ✅ Review ERD schema
2. ⏳ Create PostgreSQL database
3. ⏳ Run migrations
4. ⏳ Seed initial data
5. ⏳ Implement API endpoints
6. ⏳ Test with sample data
---
**Last Updated**: 2024-12-24
**Version**: 2.0 (Improved)