Create a complete university student management system database in PostgreSQL with ERD, tables, keys, normalization, SQL queries, and reporting. Ideal for DBMS final-year projects and database design assignments.
Students will design and implement a University Student Management System in PostgreSQL.
The project should demonstrate the complete journey:
Real-World Problem ↓ Requirements ↓ Entities & Attributes ↓ ERD ↓ ERD → Relations/Tables ↓ Primary & Foreign Keys ↓ Normalization (1NF → 2NF → 3NF) ↓ PostgreSQL Database Implementation ↓ SQL Queries ↓ Views & Reports ↓ Optional: MS Access / Front-End ↓ Modern Database Concepts: NoSQL & Vector Databases
A university wants to maintain information about:
The system should help the university answer questions such as:
Identify the entities themselves from the requirements before creating the ERD.
A suitable final design could contain:
Identify and explain relationships such as:
Department
|
| 1 : M
↓
Program
|
| 1 : M
↓
Student
and:
Department
|
| 1 : M
↓
Teacher
Department
|
| 1 : M
↓
Course
Course
|
| 1 : M
↓
Section
|
| M : 1
↓
Semester
The important many-to-many relationship is:
Student M : N Course
which should be resolved through:
Student
|
| 1:M
↓
Enrollment
↑
| M:1
|
Course
A possible final relational model:
department
-----------
department_id PK
department_name
program
-------
program_id PK
program_name
degree_level
department_id FK
student
-------
student_id PK
registration_no UNIQUE
student_name
email
date_of_birth
gender
program_id FK
admission_year
teacher
-------
teacher_id PK
teacher_name
email
designation
department_id FK
course
------
course_id PK
course_code UNIQUE
course_title
credit_hours
department_id FK
semester
--------
semester_id PK
semester_name
academic_year
start_date
end_date
section
-------
section_id PK
course_id FK
teacher_id FK
semester_id FK
section_name
room_no
enrollment
----------
enrollment_id PK
student_id FK
section_id FK
enrollment_date
status
result
------
result_id PK
enrollment_id FK
mid_marks
final_marks
total_marks
grade
grade_point
attendance
----------
attendance_id PK
enrollment_id FK
attendance_date
status
Students should explain:
A primary key uniquely identifies each record in a table.
Example:
student_id INTEGER PRIMARY KEY
Example:
program_id INTEGER REFERENCES program(program_id)
Explain how foreign keys maintain relationships between tables.
For example:
registration_no VARCHAR(20) UNIQUE
a student’s registration number can uniquely identify a student even though the database uses student_id as the primary key.
This should be an important part of the project.
For example:
| Reg No | Student | Department | Course 1 | Course 2 | Course 3 |
|---|---|---|---|---|---|
| 2024-CS-001 | Ali | CS | DB | OOP | AI |
Then demonstrate why this design is problematic.
Remove repeating groups and make values atomic.
Explain partial dependency and separate data appropriately.
Remove transitive dependencies.
Finally arrive at:
Department
Program
Student
Teacher
Course
Semester
Section
Enrollment
Result
Attendance
Important: Show the transformation rather than simply saying “the database is in 3NF.”
Must actually create the database using PostgreSQL.
For example:
CREATE DATABASE university_db;
Then create tables using:
CREATE TABLE department (
department_id SERIAL PRIMARY KEY,
department_name VARCHAR(100) NOT NULL UNIQUE
);
Students should demonstrate:
CREATE DATABASECREATE TABLEPRIMARY KEYFOREIGN KEYUNIQUENOT NULLCHECKDEFAULTShould insert realistic sample data.
Minimum suggested data:
| Table | Minimum Records |
|---|---|
| Department | 4 |
| Program | 6 |
| Student | 30 |
| Teacher | 10 |
| Course | 15 |
| Semester | 4 |
| Section | 20 |
| Enrollment | 100 |
| Result | 80 |
| Attendance | 100+ |
Each group should prepare at least 15 SQL queries, covering different concepts.
SELECT * FROM student;
SELECT *
FROM student
WHERE admission_year = 2024;
SELECT *
FROM student
ORDER BY student_name;
SELECT COUNT(*)
FROM student;
SELECT program_id, COUNT(*)
FROM student
GROUP BY program_id;
SELECT s.student_name, p.program_name
FROM student s
JOIN program p
ON s.program_id = p.program_id;
Demonstrate queries involving 3–5 tables.
SELECT program_id, COUNT(*)
FROM student
GROUP BY program_id
HAVING COUNT(*) > 5;
INEXISTSCASETo make this a PostgreSQL project rather than simply a generic SQL project, require students to demonstrate at least 3 PostgreSQL-specific features.
For example:
SERIAL / Identitystudent_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
CREATE VIEW student_course_view AS
SELECT ...
CREATE FUNCTION ...
For example, automatically record changes to student information.
CREATE INDEX idx_student_registration
ON student(registration_no);
For example:
DATE
TIMESTAMP
BOOLEAN
NUMERIC
JSONB
Connect th database with MS Access, to make front-end components (Forms and Reports).
They can demonstrate:
The important concept to explain is:
PostgreSQL = Database/Backend MS Access = Possible Front-End
a database system can have separate front-end and back-end components.
Each group (2-3 students) can present the project in this sequence:
What real-world problem are we solving?
What information does the university need to maintain?
Identify:
Student
Department
Program
Course
Teacher
Semester
...
Show entities, attributes and relationships.
Demonstrate:
ERD → Relations/Tables
Explain:
Primary Key
Foreign Key
Candidate Key
Unique Key
Composite Key
Show:
Unnormalized
↓
1NF
↓
2NF
↓
3NF
Demonstrate the actual database.
Run important queries live.
Show meaningful outputs.
Demonstrate:
View / Function / Trigger / Index / JSONB
Briefly explain:
RDBMS
↓
NoSQL
↓
Vector Database
↓
AI / Semantic Search
Each group(2-3 students) should submit:
| Component | Marks |
|---|---|
| Problem & Requirements | 10 |
| ERD & Relationships | 15 |
| Mapping ERD → Relations | 10 |
| Keys & Constraints | 10 |
| Normalization | 15 |
| PostgreSQL Implementation | 15 |
| SQL Queries | 10 |
| PostgreSQL Advanced Features | 5 |
| Presentation & Viva | 10 |
| Total | 100 |