7.0 KiB
MongoDB to MySQL Migration Summary
Overview
This document has been successfully migrated from MongoDB/Mongoose to MySQL/Sequelize architecture.
Major Changes
1. Technology Stack Update
- Changed from: MongoDB with Mongoose ODM
- Changed to: MySQL 8.0+ with Sequelize ORM
- Stack name: Updated from "MEAN Stack" to "MySQL + Express + Angular + Node"
2. Database Schema Transformation
ID Strategy
- MongoDB: ObjectId (12-byte identifier)
- MySQL: UUID (CHAR(36) or BINARY(16))
Data Types Mapping
| MongoDB | MySQL |
|---|---|
| ObjectId | CHAR(36) UUID |
| String | VARCHAR/TEXT |
| Number | INT/DECIMAL |
| Boolean | BOOLEAN |
| Date | TIMESTAMP |
| Mixed | JSON |
| Array | JSON or Junction Tables |
| Embedded Documents | JSON or Separate Tables |
Schema Design Approach
- Normalized tables for core entities (users, questions, categories)
- Junction tables for many-to-many relationships (bookmarks, achievements, quiz questions)
- JSON columns for flexible data (question options, keywords, tags, feature restrictions)
- Proper foreign keys with cascading deletes/updates
3. Database Tables Created
- users - User accounts and statistics
- categories - Question categories
- questions - Question bank with guest visibility controls
- quiz_sessions - Active and completed quiz sessions
- quiz_session_questions - Junction table for session questions
- quiz_answers - Individual question answers
- guest_sessions - Guest user sessions
- guest_settings - Guest access configuration
- guest_settings_categories - Junction table for guest-accessible categories
- achievements - Achievement definitions
- user_achievements - User earned achievements
- user_bookmarks - User bookmarked questions
4. Key Features
Indexes Added
- Primary key indexes (UUID)
- Foreign key indexes for relationships
- Composite indexes for common queries
- Full-text search indexes on question content
- Performance indexes on frequently queried columns
MySQL-Specific Optimizations
- InnoDB storage engine
- UTF8MB4 character set for emoji support
- Connection pooling configuration
- Query optimization examples
- Backup and restore strategies
5. Sequelize Models
All models include:
- UUID primary keys
- Proper associations (hasMany, belongsTo, belongsToMany)
- Field name mapping (camelCase to snake_case)
- Timestamps (created_at, updated_at)
- Validation rules
- Indexes defined at model level
6. Configuration Updates
Environment Variables
# Old (MongoDB)
MONGODB_URI=mongodb://localhost:27017/interview_quiz
# New (MySQL)
DB_HOST=localhost
DB_PORT=3306
DB_NAME=interview_quiz_db
DB_USER=root
DB_PASSWORD=your_password
DB_DIALECT=mysql
Dependencies to Update
# Remove
npm uninstall mongoose
# Install
npm install sequelize mysql2
npm install -g sequelize-cli
7. Migration Strategy
Development Setup
- Install MySQL 8.0+
- Create database with UTF8MB4
- Run Sequelize migrations
- Seed initial data
- Start application
Migration Commands
# Initialize Sequelize
npx sequelize-cli init
# Create migration
npx sequelize-cli migration:generate --name migration-name
# Run migrations
npx sequelize-cli db:migrate
# Rollback migration
npx sequelize-cli db:migrate:undo
# Seed database
npx sequelize-cli db:seed:all
8. Security Enhancements
- SQL Injection Prevention: Sequelize parameterized queries
- Prepared Statements: All queries use prepared statements
- Connection Security: SSL/TLS support for production
- Role-based Access: Maintained through user roles table
9. Performance Considerations
Query Optimization
- Use of composite indexes
- Efficient JOIN operations
- Connection pooling (max 10 connections)
- Query result caching with Redis
- Lazy loading for associations
Database Configuration
- InnoDB buffer pool tuning
- Query cache optimization (MySQL 5.7)
- Binary logging for replication
- Slow query log monitoring
10. Deployment Updates
Development
- Local MySQL instance
- Sequelize migrations for schema management
Staging
- Managed MySQL (AWS RDS, Azure Database, PlanetScale)
- Automated migration deployment
Production
- Read replicas for scaling
- Automated backups (daily snapshots)
- Point-in-time recovery
- Connection pooling with ProxySQL (optional)
What Stayed the Same
✅ API Endpoints - All endpoints remain unchanged
✅ Frontend Code - No changes required to Angular app
✅ JWT Authentication - Token strategy unchanged
✅ Business Logic - Core features remain identical
✅ User Stories - All acceptance criteria maintained
Breaking Changes
⚠️ Database Migration Required - Cannot directly migrate MongoDB data to MySQL without transformation
⚠️ ORM Changes - All Mongoose code must be rewritten to Sequelize
⚠️ Array Queries - MongoDB array operations need to be rewritten for JSON columns or junction tables
⚠️ Aggregation Pipelines - Complex MongoDB aggregations need to be rewritten as SQL JOINs and GROUP BY
Data Migration Steps
If migrating existing MongoDB data:
-
Export MongoDB Data
mongoexport --db interview_quiz --collection users --out users.json mongoexport --db interview_quiz --collection questions --out questions.json # ... export all collections -
Transform Data
- Convert ObjectIds to UUIDs
- Flatten embedded documents
- Split arrays into junction tables
- Map MongoDB types to MySQL types
-
Import to MySQL
# Use custom Node.js script to import transformed data node scripts/import-from-mongodb.js
Testing Checklist
- All database tables created successfully
- Foreign key constraints working
- Indexes created and optimized
- User registration and login working
- Guest session management working
- Quiz session creation and completion
- Question CRUD operations (admin)
- Bookmark functionality
- Achievement system
- Full-text search on questions
- Dashboard statistics queries
- Performance testing (1000+ concurrent users)
- Backup and restore procedures
- Migration rollback testing
Additional Resources
Sequelize Documentation
MySQL Documentation
Version Information
- Document Version: 2.0 - MySQL Edition
- Migration Date: November 2025
- Database: MySQL 8.0+
- ORM: Sequelize 6.x
- Node.js: 18+
Migration completed successfully! 🎉