所有文件已经上传至https://github.com/shuimqy/Student-Information-Management-System-implemented-with-Qt.git
需要的话可自行下载,自己写的数据库大作业,尽量不要照搬提交。
如果对你有帮助的话,点个赞吧,有问题欢迎留言!
下面是我的涉及过程即设计报告。
需求分析
概念结构设计
逻辑结构设计
功能实现
遇到的主要问题及解决方法
总结
-
需求分析
系统数据:
要有一定数量的学生、教师、课程、成绩等基本信息。
所以要在数据库建好后提前输入一些信息。
功能:
录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息;
按学号、姓名、专业三种方式查询学生基本信息;
录入一位学生一门课的成绩;
查询一位学生所修的课程、性质(必修或选修)、学期、学分及成绩;查询他的必修课平均成绩、所有课程平均成绩(平均成绩应按学分加权);
查询一位学生被哪些教师教过课;
查询快要被开除的学生(距被开除差3学分之内);
要实现这些功能,就要定义完整全面的数据库语义并实现,这将在概念结构设计中论述。
-
概念结构设计
- 学校有若干专业,每个专业每年招若干个班,每个班有若干学生。已经有了4个基本表,但要实现这条语义,要建major(MajorID)表,主键为MajorID;class(ClassID,MajorID)表,主键为ClassID,外键为MajorID;`student-class`(StudentID,ClassID)表,主键约束为:(StudentID,ClassID),用于限制一个学生只能在加入一个班级,外键为StudentID,ClassID。
- 每个专业有自己的教学计划,规定了该专业相关课程的性质(必修或选修)以及授课学期。创建majorplan(MajorID,CourseID,Semester,quality),主键约束是(MajorID,CourseID),外键是MajorID、CourseID,Semester是学期,quality是课程性质。
- 一位教师可以给多个班带课,但不能给一个班带多门课。这是一对多关系,创建不能给一个班带多门课已在majorplan表中通过主键约束实现,创建`teacher-course`(TeacherID,CourseID)表,主键约束是(TeacherID,CourseID),因为一个老师可能教多门课,外键是TeacherID,CourseID,外键约束一般都与基本表关联。
majorplan 与 major:是一对多(1:n)关系。一个专业可以有多个专业计划,而一个专业计划只属于一个专业。
majorplan 与 course:是一对多(1:n)关系。一个专业计划可以包含多门课程,而一门课程可以属于多个专业计划。
course 与 teacher - course:是一对多(1:n)关系。一门课程可以由多个教师教授,而一个教师 - 课程关系只对应一门课程。
teacher - course 与 teacher:是多对一(n:1)关系。一个教师可以教授多门课程,而一个教师 - 课程关系只对应一个教师。
course 与 grade:是一对多(1:n)关系。一门课程可以有多个学生的成绩,而一个成绩只对应一门课程。
student 与 grade:是一对多(1:n)关系。一个学生可以有多个课程成绩,而一个成绩只对应一个学生。
student 与 student - class:是一对多(1:n)关系。一个学生只属于一个班级,而一个班级可以有多个学生。
student - class 与 class:是多对一(n:1)关系。一个班级可以有多个学生,而一个学生 - 班级关系只对应一个班级。
class 与 major:是多对一(n:1)关系。一个专业可以有多个班级,而一个班级只属于一个专业。
下面是根据语义设计出的E-R图:
-
逻辑结构设计
根据E - R 图生成关系模型如下:
majorplan(专业计划)
关系模式:majorplan(MajorID, CourselD, Semester, quality)
主码:(MajorID, CourselD),因为这两个属性的组合能够唯一标识一个专业计划。
major(专业)
关系模式:major(MajorID)
主码:MajorID,专业编号可以唯一标识一个专业。
course(课程)
关系模式:course(CourselD, CourseName, Credits)
主码:CourselD,课程编号可以唯一标识一门课程。
teacher - course(教师 - 课程)
关系模式:teacher - course(TeacherID, CourselD)
主码:(TeacherID, CourselD),教师编号和课程编号的组合可以唯一标识一个教师教授某门课程的关系。
teacher(教师)
关系模式:teacher(TeacherID, TeacherName)
主码:TeacherID,教师编号可以唯一标识一个教师。
grade(成绩)
关系模式:grade(StudentID, CourselD, Score)
主码:(StudentID, CourselD),学生编号和课程编号的组合可以唯一标识一个学生在某门课程上的成绩。
student(学生)
关系模式:student(StudentID, StudentName, StudentGender, Birthday)
主码:StudentID,学生编号可以唯一标识一个学生。
student - class(学生 - 班级)
关系模式:student - class(StudentID, ClassID)
主码:(StudentID, ClassID),学生编号和班级编号的组合可以唯一标识一个学生属于某个班级的关系。
class(班级)
关系模式:class(ClassID, MajorID)
主码:ClassID,班级编号可以唯一标识一个班级。
外码设置:
在majorplan关系中:
MajorID是外码,参照major关系中的MajorID。
CourselD是外码,参照course关系中的CourselD。
在teacher - course关系中:
TeacherID是外码,参照teacher关系中的TeacherID。
CourselD是外码,参照course关系中的CourselD。
在grade关系中:
StudentID是外码,参照student关系中的StudentID。
CourselD是外码,参照course关系中的CourselD。
在student - class关系中:
StudentID是外码,参照student关系中的StudentID。
ClassID是外码,参照class关系中的ClassID。
在class关系中:
MajorID是外码,参照major关系中的MajorID。
-
功能实现
在开始实现功能前,要先向数据库中录入一些数据,我在这里使用python的pandas库向数据库的表中添加数据,例如:
为了方便处理,教学计划表的数据只添加了一个学期的,每个专业一学期学4门课:
数据添加完成后,开始功能的实现:
1.录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息
我做了ui界面来更好地说明这个功能的实现过程,下面是我的ui界面:
在这里我需要输入要录入的学生信息,之后点击信息录入,会执行下面的sql语句及代码:
第一条sql语句是向student表中添加信息,VALUES的值是ui界面中前4个edit框的文本内容。第二条sql语句是向`student-class`表中添加信息。
下面进行测试,ui输入如下:
点击执行,然后查看数据库表中的内容:
可以看到,两个表中数据均插入成功。
- 按学号、姓名、专业三种方式查询学生基本信息
Ui设计如下:
在左侧的三个edit框分别为查询学生信息的三种方式,点击查询后,结果将显示在右侧的table表中,sql语句及代码如下:
语句中的smv是我创建的视图,为了简化系统的设计,视图创建语句如下:
视图中的数据如下:
首先按学号查询结果如下:
按姓名查询结果如下:
按专业查询结果如下:
3.录入一位学生一门课的成绩
Ui设计如下:
因为学生专业不一样,其所学课程也不一样,输入学号后先点击查询课程,下方的课程ID框会更新选项,sql语句及代码如下:
第一个语句是查询学号对应专业下的下的课程ID,第二个语句是向grade表中插入成绩,向前面插入的学生李明添加成绩,ui输入如下:
点击录入,查看数据库表:
可以看到录入成功。
4.查询一位学生所修的课程、性质(必修或选修)、学期、学分及成绩;查询他的必修课平均成绩、所有课程平均成绩(平均成绩应按学分加权)
Ui设计如下:
Sql语句及代码如下:
newview是一个视图,创建语句如下:
数据如下:
这个视图在创建时还用到了另一个视图,创建语句如下:
可见这个视图只比grade表多了一列,这样做是为了避免在查询时的数据冗余,后面会具体说明。
平均分的计算代码如下:
下面进行测试,ui输入如下:
点击查询,结果如下:
5.查询一位学生被哪些教师教过课
这个功能其实已经在第四个功能中实现了。
- 查询快要被开除的学生
Ui设计入下:
sql语句和代码如下:
从视图中查询挂科学分大于2的学生ID,结果如下:
-
遇到的主要问题及解决办法
在查询学生课程信息时,人工智能和软件工程专业的同学,CS3221025这门课会出现两次,原因是在构建试图时,使用的判别方法是grade表的CourseID相等,但是由于人工智能和软件工程这两个专业的专业计划中都有CS3221025这门课,所以会造成上面的冗余问题。
解决方法是创建一个新的视图包含grade的所有列,且多加一列major属性,这样在判断时多加一个条件即专业ID相同,即可解决冗余的问题。
-
总结
在本实验中,我完成了数据库的构建以及前端界面的实现,收获颇多,对sql语句有了更深的了解,也明白了语义设计在数据库设计中的重要性。
标签:关系,sql,pyqt,学生,课程,ui,MajorID,CourselD,查询 From: https://blog.csdn.net/m0_74810549/article/details/145148738