-- Roles table stores information about user roles CREATE TABLE roles ( id INT PRIMARY KEY AUTO_INCREMENT, type VARCHAR(50) NOT NULL, identity VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, ); -- Users table stores information about all users CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, contact VARCHAR(255) UNIQUE, email VARCHAR(255) UNIQUE, description TEXT, password VARCHAR(255) NOT NULL, role_id INT, image VARCHAR(255), remember_token VARCHAR(255), status INT DEFAULT 1 COMMENT '1 active, 0 inactive', access_block TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted_at TIMESTAMP NULL, FOREIGN KEY (role_id) REFERENCES roles(id) ); -- Students table stores additional information about students CREATE TABLE students ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, contact VARCHAR(255) UNIQUE, email VARCHAR(255) UNIQUE, password VARCHAR(255) NOT NULL, role_id INT, date_of_birth DATE, gender ENUM('male', 'female', 'other'), image VARCHAR(255), remember_token VARCHAR(255), status INT DEFAULT 1 COMMENT '1 active, 0 inactive', access_block TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted_at TIMESTAMP NULL, FOREIGN KEY (role_id) REFERENCES roles(id) ); -- Instructors table stores additional information about instructors CREATE TABLE instructors ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, contact VARCHAR(255) UNIQUE, email VARCHAR(255) UNIQUE, password VARCHAR(255) NOT NULL, role_id INT, bio TEXT, image VARCHAR(255), remember_token VARCHAR(255), status INT DEFAULT 1 COMMENT '1 active, 0 inactive', access_block TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted_at TIMESTAMP NULL, FOREIGN KEY (role_id) REFERENCES roles(id) ); -- Course Categories table stores information about course categories CREATE TABLE course_categories ( id INT PRIMARY KEY AUTO_INCREMENT, category_name varchar(255) NOT NULL, category_status tinyint(1) NOT NULL DEFAULT 1 COMMENT '1 active, 0 inactive', category_image varchar(255) DEFAULT NULL, created_at timestamp NULL DEFAULT NULL, updated_at timestamp NULL DEFAULT NULL, deleted_at timestamp NULL DEFAULT NULL, ); -- Courses table stores information about each course CREATE TABLE courses ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255) NOT NULL, description TEXT, category_id INT, difficulty ENUM('beginner', 'intermediate', 'advanced') NOT NULL, instructor_id INT, price DECIMAL(10, 2) DEFAULT 0.00, is_free BOOLEAN DEFAULT false, is_subscription_based BOOLEAN DEFAULT false, subscription_price DECIMAL(10, 2), prerequisites TEXT, image VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (instructor_id) REFERENCES instructors(id), FOREIGN KEY (category_id) REFERENCES course_categories(id) ); -- Enrollments table tracks which users are enrolled in which courses CREATE TABLE enrollments ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT, course_id INT, enrollment_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (course_id) REFERENCES courses(id) ); -- Materials table stores various types of course materials CREATE TABLE materials ( id INT PRIMARY KEY AUTO_INCREMENT, course_id INT, title VARCHAR(255) NOT NULL, type ENUM('video', 'document', 'quiz') NOT NULL, content_url TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (course_id) REFERENCES courses(id) ); -- Quizzes table stores information about quizzes CREATE TABLE quizzes ( id INT PRIMARY KEY AUTO_INCREMENT, course_id INT, title VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (course_id) REFERENCES courses(id) ); -- Questions table stores individual questions for quizzes CREATE TABLE questions ( id INT PRIMARY KEY AUTO_INCREMENT, quiz_id INT, content TEXT NOT NULL, type ENUM('multiple_choice', 'true_false', 'short_answer') NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (quiz_id) REFERENCES quizzes(id) ); -- User_answers table stores user responses to quiz questions CREATE TABLE user_answers ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT, question_id INT, answer TEXT, is_correct BOOLEAN, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (question_id) REFERENCES questions(id) ); -- Reviews table stores reviews for courses CREATE TABLE reviews ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT, course_id INT, rating INT, comment TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (course_id) REFERENCES courses(id) ); -- Payments table stores information about individual transactions CREATE TABLE payments ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT, course_id INT, amount DECIMAL(10, 2) NOT NULL, payment_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, payment_method VARCHAR(255), transaction_id VARCHAR(255), status ENUM('success', 'pending', 'failed') DEFAULT 'pending', FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (course_id) REFERENCES courses(id) ); -- Subscriptions table tracks user subscriptions CREATE TABLE subscriptions ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT, course_id INT, plan ENUM('monthly', 'yearly') NOT NULL, start_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, end_date TIMESTAMP, status ENUM('active', 'canceled', 'expired') DEFAULT 'active', FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (course_id) REFERENCES courses(id) ); -- Course_progress table stores information about user progress in each course CREATE TABLE course_progress ( progress_id INT PRIMARY KEY AUTO_INCREMENT, student_id INT, course_id INT, progress_percentage INT DEFAULT 0, completed BOOLEAN DEFAULT false, last_viewed_material_id INT, last_viewed_at TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (course_id) REFERENCES courses(id), FOREIGN KEY (last_viewed_material_id) REFERENCES materials(id) ); -- Discussions table stores discussions related to courses CREATE TABLE discussions ( discussion_id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, course_id INT, title VARCHAR(255) NOT NULL, content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(user_id), FOREIGN KEY (course_id) REFERENCES courses(course_id) ); -- Messages table stores direct messages between users CREATE TABLE messages ( message_id INT PRIMARY KEY AUTO_INCREMENT, sender_id INT, receiver_id INT, content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (sender_id) REFERENCES users(user_id), FOREIGN KEY (receiver_id) REFERENCES users(user_id) );