Course Management Models
Overview
This document outlines the Mongoose schemas used in the course management system. It includes models for courses, student course enrollments, faculty assignments, course registrations, program-course mappings, and approval requests.
Models
Course Model
Represents the details of a course offered by a department.
Schema Definition
const courseSchema = new mongoose.Schema({
courseCode: { type: String, required: true, unique: true },
courseName: { type: String, required: true },
department: { type: String, required: true },
slot: { type: String, required: true },
announcements: [{
id: { type: mongoose.Schema.Types.ObjectId, auto: true },
title: { type: String, required: true },
content: { type: String, required: true },
importance: { type: String, enum: ['Low', 'Medium', 'High', 'Critical'], default: 'Medium' },
date: { type: Date, default: Date.now },
postedBy: { type: String, ref: 'Faculty' },
attachments: [{ name: String, url: String }]
}],
students: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Student' }],
credits: { type: Number, required: true, default: 6 },
maxIntake: { type: Number, required: true, default: 100 },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now }
});
Key Fields
courseCode: Unique identifier for the course.announcements: Embedded array of announcements with importance, title, content, and attachments.students: References to enrolled student IDs.
StudentCourse Model
Represents the mapping between a student and a course enrollment.
const studentCourseSchema = new mongoose.Schema({
rollNo: { type: String, required: true, ref: 'Student' },
courseId: { type: String, required: true, ref: 'Course' },
creditOrAudit: { type: String, enum: ['Credit', 'Audit'], required: true },
semester: { type: String, required: true },
status: { type: String, enum: ['Approved', 'Pending'], default: 'Pending' },
grade: { type: String, default: null },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now },
isCompleted: { type: Boolean, default: false },
});
- Maps a course enrollment for a student.
- Tracks status, completion, and grade.
FacultyCourse Model
Defines which faculty teaches which course during which session.
export const facultyCourseSchema = new mongoose.Schema({
facultyId: {
type: String,
required: true,
ref: 'Faculty'
},
courseCode: {
type: String,
required: true,
ref: 'Course'
},
year: {
type: Number,
required: true
},
session: {
type: String,
enum: ['Winter Semester', 'Spring Semester', 'Summer Course'],
required: true
},
status: {
type: String,
enum: ['Ongoing', 'Completed'],
default: 'Ongoing'
},
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
});
- Helps track faculty-course allocation and teaching status.
CourseRegistration Model
Temporary model representing a student's course registration submission.
const courseRegistrationSchema = new mongoose.Schema({
courseCode: {
type: String,
required: true,
ref: 'Course'
},
rollNo: {
type: String,
required: true,
ref: 'Student'
},
creditOrAudit: {
type: String,
enum: ['Credit', 'Audit'],
required: true
},
semester: {
type: String,
required: true
},
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
});
- Used during the registration phase before approval.
ProgramCourseMapping Model
Specifies which course is mapped to which program and academic term.
const programCourseMappingSchema = new mongoose.Schema({
courseCode: {
type: String,
required: true,
ref: 'Course'
},
program: {
type: String,
required: true
},
department: {
type: String,
required: true
},
year: {
type: Number,
required: true
},
semester: {
type: String,
required: true
},
type: {
type: String,
enum: ['Core', 'Elective'],
required: true
}
});
- Useful for filtering courses relevant to a student’s curriculum.
CourseApprovalRequest Model
Stores approval requests for students registering to courses.
const courseApprovalRequestSchema = new mongoose.Schema({
studentId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Student',
required: true
},
courseCode: {
type: String,
required: true,
ref: 'Course'
},
courseType: {
type: String,
enum: ['Core', 'Elective', 'Audit'],
required: true
},
status: {
type: String,
enum: ['Pending', 'Approved', 'Rejected'],
default: 'Pending'
},
createdAt: {
type: Date,
default: Date.now
},
});
- Tracks course approval requests with their status.
Model Registration
export const Course = mongoose.model('Course', courseSchema);
export const StudentCourse = mongoose.model('StudentCourse', studentCourseSchema);
export const FacultyCourse = mongoose.model('FacultyCourse', facultyCourseSchema);
export const CourseRegistration = mongoose.model('CourseRegistration', courseRegistrationSchema);
export const ProgramCourseMapping = mongoose.model('ProgramCourseMapping', programCourseMappingSchema);
export const CourseApprovalRequest = mongoose.model('CourseApprovalRequest', courseApprovalRequestSchema);
Each model is registered with Mongoose and exported for use in the rest of the application.
Database Considerations
Indexing
- Ensure
courseCode,rollNo,facultyId, and other references are indexed for performance. - Embedded documents like announcements should be monitored for size.
- Schema defaults and enums ensure consistent and valid data.
Data Validation
The models incorporate several built-in validation strategies:
- Use of
requiredflags ensures critical fields are always provided. enumvalues restrict fields like status or course type to valid entries, improving data consistency.- Defaults (e.g., for timestamps and status) ensure predictable initial values.
- Unique constraints like on
courseCodehelp prevent data duplication.
Performance Considerations
- Arrays such as
Course.studentsandCourse.announcementscan grow large; pagination or limit mechanisms should be used in production scenarios. - Virtual population of announcements or related student info can improve performance when large documents are not always necessary.
- Keeping track of timestamps (
createdAt,updatedAt) can help with audit logging and optimization.