Software: SQL (Datagrip, Docker, Flask, Appsmith)

The goal of this project is to conceptualize, design, and implement a database-driven application. To do this, our team worked to:

  • identify a general software product idea for your application

  • outline 4-5 major features of four different user personas of the product 

  • develop a localized conceptual data model (as ER Diagram) for each user persona

  • incorporate the four localized data models into a global data model in the from of a global ER diagram

  • convert the global ER diagram into a relational model

  • implement the relational model in MySQL with appropriate constraints

  • bootstrap the database with realistic auto-generated data

  • develop robust queries to support each feature of each user persona

  • design and implement a REST API as a data access layer using Python + the Flask framework containing at least 15 endpoints (at least some of which must modify the underlying DB)

  • implement a proof-of-concept user interface for your application composed of a set of at least 6 cohesively designed and organized pages/screens providing a positive user experience

High level project architecture

General project architecture

Brief synopsis of project/product

Teacher’s Assistant (TA) is an all-in-one class management system for college courses combined into one service, integrating capabilities like assignment posting/submission, discussion boards, TA management, course registration, office hours, and course feedback into one platform. Currently, professors, TAs, students, and administrators find themselves navigating too many platforms for essential course operations, wasting time and diverting both time and energy away from important course content. This can result in many challenges, such as professors being unable to cover their entire curriculum within the span of a semester, students missing out on potential learning opportunities, TAs feeling overworked as students come with questions about content that had to be taught quickly in class, and administrators feeling troubled by constant requests to fix backend issues on numerous platforms. 

By consolidating these functionalities into one place, users will only need to become familiar with one interface, and universities can be better prepared to troubleshoot issues on one technology system. While pre-existing education platforms like Canvas and Gradescope include some of the functionalities listed above, Teacher’s Assistant offers a new way to streamline all necessary course management tools in one location, alleviating stress and anxiety for professors, students, TAs, and administrators all semester long. 

User personas

Persona 1: Harry Morrison (Professor)

Biography: Harry Morrison is a professor of Computer Science at Stanford University. He has a passion for front-end coding and has taught for over 20 years. He tries to encourage all his students to embrace technology as it is growing rapidly in our society.

Age: 49 Gender: Male Occupation: Professor of Computer Science

Hobbies: Harry is fascinated by machine AI tools and front-end development, although he truly loves his coffee.

Likes: 

  • Front-end development

  • Machine AI tools

  • Open-source software

Dislikes:

  • Inefficient communication channels

  • Wasting time

User Stories for Persona 1:

  1. As a professor, I would like a single page where I can easily reach out to the TAs so I can avoid wasting time with scheduling duties.

  2. As a professor, I would like a platform where I can see everyone’s schedule for the week and make changes if needed so I don’t need to check multiple platforms.

  3. As a professor, I would like to see the hours that my TAs and I have put into the program so I can keep track of our progress and monitor our investment in students.

  4. As a professor, I would like a platform where students can automatically reach out to TAs with specific office hour-related questions so I can be more available for overall course questions and concerns from students.

Persona 2: Alex Fernandez (Teaching Assistant)

Biography: Alex Fernandez is a 20-year-old undergraduate majoring in Computer Science, currently working part-time as a Teaching Assistant (TA) for the foundational Computer Science course (Fundies) while pursuing his degree full-time. With two years of experience in the TA role, Alex adeptly balances his teaching responsibilities alongside academic research and coursework. His commitment to education and personal growth is evident in his active search for ways to manage his time more efficiently, streamline communication, and ensure a balanced workload both for himself and his fellow TAs.

Age: 20 Gender: Male

Occupation: Teaching Assistant (Part-time), Undergraduate Student in Computer Science at Stanford (Full-time)

Hobbies: Soccer, spending time in nature, traveling, cooking

Likes:

  • Utilizing productivity tools for efficient task management, so I can be effective and still have time for my other responsibilities and hobbies

  • Having real-time access to earnings as a student is helpful for financial planning

  • Gaining insights into personal performance and contributions to the team

  • Flexible scheduling that aligns with his student commitments, preferring a consistent number of hours worked each week but with the flexibility to vary the specific times

Dislikes:

  • Inefficiency and time wasted due to disorganized communication and scheduling

  • The need for a job that dynamically fits his busy student lifestyle without making office hours/labs the focal point, emphasizing the importance of flexibility in scheduling

  • Juggling TA responsibilities across multiple platforms

User Stories for Persona 2:

  1. As a TA, I want to see all submissions for the course that haven’t been reviewed yet, so I can grade them.

  2. As a TA, I would like to see the office hours schedule, so I can plan for the week. 

  3. As a TA, I want the count of regrade requests for each assignment, so I can split them evenly among my co-workers. 

  4. As a TA, I want to see all messages I haven’t responded to yet, so I can stay updated with communication between my co-workers/students. 

Persona 3: Emily Johnson (Student)

Biography: Emily Johnson is a freshman at Stanford University majoring in Computer Science. She discovered her love for coding during high school, which prompted her to pursue it as a major. She was fascinated by the way software could solve real world problems so she dedicated herself to mastering programming languages like Python and JavaScript. Emily is very involved in the community. She is part of multiple clubs such as the coding club and has participated in her fair share of hackathons. 

Age: 18 Gender: Female

Occupation: Undergraduate Student in Computer Science at Stanford (Full-time)

Hobbies: Photography, Theatre, Cooking, Reading, Writing Novels

Likes:

  • Solving complex problems whether they're related to coding challenges, puzzles, or real-life situations

  • Exploring new and emerging technologies, programming languages, and frameworks 

  • Expanding her coding knowledge, believes that there is always more for her to learn

Dislikes: 

  • Spending hours tracking down elusive bugs or dealing with cryptic error messages

  • Repetitive or monotonous tasks 

  • Encountering stereotypes or biases in the tech industry 

  • Feeling overwhelmed by school work 

  • Encountering poorly optimized or inefficient code

  • Technical issues or system failures that disrupt workflow or cause data loss

User Stories for Persona 3:

  1. As a student, I would like to see when office hours are so I can plan my schedule around going if I need help on an assignment or just have a general question.

  2. As a student, I would like to look at feedback given by other students about classes so I can see what classes I would like to take based on the reviews. 

  3. As a student, I would like to see other students' questions so I don’t ask repeat questions and so I can understand the content better as sometimes other students have questions I didn’t think of on my own.

  4. As a student, I would like to see all of my assignments and their grades so I can see if I am doing well in the class or if I need to go talk to office hours. 

Persona 4: Mary Bishop (Academic Coordinator)

Biography: Mary Bishop has been an Academic Coordinator at Stanford for seven years. She has a true passion for organization, collaboration, and education, and she loves playing a large role in helping the Computer Science department provide a positive experience for its students. Prior to being an Academic Coordinator, Mary worked as an assistant professor in data science where she taught courses on introductory programming and machine learning. She is also an advisor for the Women in Technology student organization at Stanford, and is a strong advocate for more diverse representation in the tech industry. 

Age: 39 Gender: Female

Occupation: Academic Coordinator (College of Information and Computer Sciences)

Hobbies: Running, cooking, learning new languages, spending time with her husband and two kids

Likes: 

  • Cross-collaboration between departments in her role at Stanford

  • Backend, operational nature of her position

  • Interacting with students and answering their questions

  • Keeping up with new developments in the tech industry and seeking ways to implement them into current curriculum to stay relevant

  • Advocating for DEI in tech

Dislikes:

  • Excessive amounts of administrative work with no tangible student impact

  • Planning the scheduling of course sections each semester

  • Dealing with technical difficulties in course platforms and registration she is assigned to fix

  • Limited opportunities to interact directly with students in her current position

  • Conducting performance evaluations for professors every semester based on student feedback

  • Combing through lots of excess information to gather data that supports her ideas for the future of the department

User Stories for Persona 4:

  1. As an Academic Coordinator, I would like to be able to access student enrollment data on one platform so that I can easily find which students are registered in each course and avoid wasting time having to copy data across platforms.

  2. As an Academic Coordinator, I would like to be able to easily review student feedback for individual courses at the end of each semester so that I can make better informed decisions about which classes should or shouldn’t be offered the following semester.

  3. As an Academic Coordinator, I would like to be able to compute average final grades for all courses offered within a semester so that I can effortlessly report course grade breakdowns to my supervisor for department approval. 

  4. As an Academic Coordinator, I would like to be able to gather a list of all emails of students registered for courses by department so that I can reach out to them with timely course registration updates specific to their home college.

Localized ER diagrams

User Persona 1: Professor - Harry Morrison

User Persona 2: TA - Alex Fernandez

User Persona 3: Student - Emily Johnson

User Persona 4: Academic Coordinator - Mary Bishop

Global ER diagram

Relational diagram

Datagrip database diagram

User story queries

1.1

SELECT TAs.Name, TAs.OfficeHours

FROM TAs

JOIN Courses ON Courses.TAID = TAs.TAID

WHERE Courses.ProfessorID = 1;

1.2

SELECT Schedules.Date, Schedules.TimeSlot, Courses.CourseName, TAs.Name AS TAName

FROM Schedules

JOIN Courses ON Schedules.CourseID = Courses.CourseID

LEFT JOIN TAs ON Courses.TAID = TAs.TAID

WHERE Schedules.ProfessorID = 1 AND Schedules.Date BETWEEN '04/2/2024' AND '04/9/2024';

1.3

SELECT Professors.Name AS ProfessorName, Professors.OfficeHours AS ProfessorOfficeHours, TAs.Name AS TAName, TAs.OfficeHours AS TAOfficeHours

FROM Professors

LEFT JOIN Courses ON Professors.ProfessorID = Courses.ProfessorID

LEFT JOIN TAs ON Courses.TAID = TAs.TAID

WHERE Professors.ProfessorID = 1;


1.4

INSERT INTO Communications (SenderID, ReceiverID, Timestamp, Content)

VALUES (10, 7, CURRENT_TIMESTAMP, 'Can I schedule an appointment during your office hours?');

2.1

SELECT s.AssignmentID as AssignmentID, s.SubmissionID as SubmissionID

FROM Submissions s

JOIN Assignments a ON s.AssignmentID = a.AssignmentID

WHERE s.Grade IS NULL;


2.2

SELECT *

FROM Schedule s 

JOIN Employees e ON s.EmployeeID = e.EmployeeID

WHERE e.fname = 'Alex' AND e.lname = 'Fernandez';

2.3

SELECT a.AssignmentID, COUNT(*) AS total_regrade_requests

FROM Submissions s

JOIN Assignments a ON s.AssignmentID = a.AssignmentID

WHERE s.RegradeRequestStatus = 1

GROUP BY a.AssignmentID;


2.4

SELECT c.Message as message_content, c.SenderID as SenderID, c.TimeSent as time_sent

FROM Employees e 

JOIN Chats c ON e.EmployeeID = c.RecipientID 

LEFT JOIN ChatReplies cr ON c.ChatID = cr.ChatID

WHERE e.fname = 'Alex' AND e.lname = 'Fernandez' AND cr.ChatID IS NULL;

3.1 

SELECT dtw.Day AND dtw.Timeslot AS OfficeHours, e.EmployeeFirstName AND e.EmployeeLastName as Name

FROM DayTimeWorked dtw 

JOIN Schedule s ON dtw.ScheduleID = s.ScheduleID 

JOIN Employees e ON s.EmployeeID = e.EmployeeID

ORDER BY OfficeHours ASC;


3.2

SELECT * 

FROM FeedbackSurveys 

ORDER BY CRN;

3.3

SELECT dp.PostTitle AND dp.PostContent as posts, e.FirstName AND e.LastName as sender, dpa.DiscussionPostAnswer as answer 

FROM DiscussionPost dp

JOIN DiscussionPostAnswers dpa ON dp.PostID = dpa.PostID 

JOIN Employees e ON dpa.EmployeeID = e.EmployeeID

WHERE answer IS NOT NULL;


3.4

SELECT * 

FROM Assignments a 

JOIN Submissions s ON a.AssignmentID = s.AssignmentID

ORDER BY a.CourseCRN; 

4.1 

SELECT * 

FROM Enrollments

ORDER BY CRN ASC;

4.2

SELECT Feedback, CRN

FROM FeedbackSurveys

ORDER BY CRN ASC;

4.3

SELECT CRN, AVG(FinalGrade) as Average_Grade

FROM Enrollments

GROUP BY CRN;

4.4

SELECT se.Email as EmailAddress, c.Department as Department

FROM StudentEmails se

JOIN Enrollments e ON se.StudentID = e.StudentID

JOIN CourseSelections cs ON e.CRN = cs.CRN

JOIN Courses c ON cs.CourseID = c.CourseID

ORDER BY Department ASC;

Updated Datagrip database diagram

Updated user story queries

1.1

SELECT TAs.Name, TAs.OfficeHours

FROM TAs

JOIN Courses ON Courses.TAID = TAs.TAID

WHERE Courses.ProfessorID = 1;

1.2

SELECT Schedules.Date, Schedules.TimeSlot, Courses.CourseName, TAs.Name AS TAName

FROM Schedules

JOIN Courses ON Schedules.CourseID = Courses.CourseID

LEFT JOIN TAs ON Courses.TAID = TAs.TAID

WHERE Schedules.ProfessorID = 1 AND Schedules.Date BETWEEN '04/2/2024' AND '04/9/2024';

1.3

SELECT Professors.Name AS ProfessorName, Professors.OfficeHours AS ProfessorOfficeHours, TAs.Name AS TAName, TAs.OfficeHours AS TAOfficeHours

FROM Professors

LEFT JOIN Courses ON Professors.ProfessorID = Courses.ProfessorID

LEFT JOIN TAs ON Courses.TAID = TAs.TAID

WHERE Professors.ProfessorID = 1;

1.4

INSERT INTO Communications (SenderID, ReceiverID, Timestamp, Content)

VALUES (10, 7, CURRENT_TIMESTAMP, 'Can I schedule an appointment during your office hours?');

2.1

For seeing all ungraded submissions:

SELECT *

FROM Submissions s

JOIN Assignments a ON s.AssignmentID = a.AssignmentID 

WHERE s.Grade IS NULL; 

For putting in a grades for an ungraded submissions:

UPDATE Submissions SET GRADE = %s 

WHERE SubmissionID = %s AND AssignnmentID = %s

2.2 

SELECT *

FROM Schedule s JOIN DayTimeWorked dtw ON dtw.ScheduleID = s.ScheduleID

JOIN Employees e ON e.EmployeeID = s.EmployeeID;

2.3

For getting all submissions:

SELECT *

FROM Submissions;

For changing grade on any submission:

UPDATE Submissions SET Grade=%s, GradedBy=%s, GradedOn=%s WHERE SubmissionID=%s;

2.4

SELECT dp.PostContent AS Content, DiscussionPostAnswers AS Reply

FROM DiscussionPosts dp

JOIN DiscussionPostAnswers da ON dp.PostID=da.PostID;

For seeing all discussion posts:

SELECT *

FROM DiscussionPosts;

For seeing post replies to discussion posts:

SELECT *

FROM DiscussionPostAnswers;

Finally, to actually post the reply: 

INSERT INTO DiscussionPostAnswers (PostID, EmployeeID, DiscussionPostAnswer, TimePosted)

VALUES (%s, %s, %s, %s);

3.1 

SELECT dtw.Day AND dtw.Timeslot AS OfficeHours, e.EmployeeFirstName AND e.EmployeeLastName as Name

FROM DayTimeWorked dtw 

JOIN Schedule s ON dtw.ScheduleID = s.ScheduleID 

JOIN Employees e ON s.EmployeeID = e.EmployeeID

ORDER BY OfficeHours ASC;


3.2

SELECT * 

FROM FeedbackSurveys 

ORDER BY CRN; 

3.3

SELECT dp.PostTitle AND dp.PostContent as posts, e.FirstName AND e.LastName as sender, dpa.DiscussionPostAnswer as answer 

FROM DiscussionPost dp

JOIN DiscussionPostAnswers dpa ON dp.PostID = dpa.PostID 

JOIN Employees e ON dpa.EmployeeID = e.EmployeeID

WHERE answer IS NOT NULL;


3.4

SELECT * 

FROM Assignments a 

JOIN Submissions s ON a.AssignmentID = s.AssignmentID

ORDER BY a.CourseCRN; 

4.1 

SELECT * 

FROM Enrollments

ORDER BY CRN ASC;

4.2

SELECT Feedback, CRN

FROM FeedbackSurveys

ORDER BY CRN ASC;

4.3

SELECT CRN, AVG(FinalGrade) as Average_Grade

FROM Enrollments

GROUP BY CRN;


4.4

SELECT se.Email as EmailAddress, c.Department as Department

FROM StudentEmails se

JOIN Enrollments e ON se.StudentID = e.StudentID

JOIN CourseSelections cs ON e.CRN = cs.CRN

JOIN Courses c ON cs.CourseID = c.CourseID

ORDER BY Department ASC;

REST API matrix

Demo video

Reflection

This project was undoubtedly the hardest project I’ve ever completed in my college career. Not only was our group tasked with defining a new product and corresponding personas with statements about how they would use that product, we then had to create thousands of entries of sample data embodying these personas, import them into a UI system, and create front-end screens that allowed real-time functionality of the product sourced from the database we had created from scratch (as well as modeled through global and local entity-relation diagrams). Aside from the challenge of the project deliverables themselves, this project had a somewhat crunched timeline near the end of the semester, making it difficult for our group to coordinate meeting times and ensure deliverables were ready by the deadline.

At the same time, I can wholeheartedly say that I am a better programmer and designer because of my experience in this course and with this project specifically. Having to create our own database with our own entries and then figure out how to source and project that information in real-time is a skill that is highly valuable in the real world, and this project enabled me to see how what we were learning in the classroom could translate to a real-life data science problem. As mentioned, although design wasn’t a specific aim of the course/project, I also feel like my design skills improved by working on a front-end system using a new software. Finally, working on this team was a bit challenging at times as we struggled to divide the project work evenly, but I learned how to manage conflict, compromise, collaborate remotely, and problem-solve when issues came up, especially when the solution wasn’t always clear.

Previous
Previous

Exploring the Relationship Between Lifestyle and Diabetic Outcomes

Next
Next

Investigating 2019 Airline Performance and Traffic Patterns