每个论文的学生数据库设计

时间:2017-08-14 15:26:03

标签: php mysql sql database

早些时候我问了一个关于attendance system的问题。在同一系统中,我还有一个单独的表来存储学生标记。现在,在我的问题之前,我想展示到目前为止我所做的事情:

每学期有2篇论文。完成课程有6个学期。在第一篇论文中,学生的最大分数为75,第二篇分数为25分。现在,我构建了一个简单的表students_marks,如下所示:

Name        | Type 
------------|-------
marks_id    | int
s_id        | int
sem_id      | int
sessionYear | varchar(11)
paper_one   | decimal(11,0)
paper_two   | decimal(11,0)

现在,marks_idprimary key,而s_idsem_idforeign keys至其他两个表student_infosemester }。

要输出所获得的标记,我会这样做:

SELECT * FROM `student_marks` 
JOIN `student_info` ON student_marks.s_id = student_info.s_id 
WHERE student_info.deleted = ? 
AND `sem_id` = ? AND `sessionYear` = ?
ORDER BY `class_roll`

我没有意识到的是,在第5和第6学期,有4篇论文,每篇论文的最高分为50分。现在,如果我在上表中增加两列,那么对于其他学期来说,这将是多余的。不需要4篇论文。

我正在寻求帮助来重新设计这张表,以便我能够合并新的论文。

提前致谢。

注意:我正在使用MySQL数据库和PHP来创建这个应用程序。

2 个答案:

答案 0 :(得分:2)

我会使用更规范化的形式:

create table student (id int, -- pk this one
                      studentinfo ... )-- all the student info

create table attendance (studentid int, -- fk to student
                         semesterid int)


create table paper (studentid INT, --fk to student table
                    selemsterid int, -- fk to attendance table
                    paperid INT, -- one for each paper
                    paperdate date, -- allows retakes
                    papermark decimal(11,0) ) -- Store the marks

select s.*, p.*
from student s
inner join attendance a
on a.studentid = s.id
inner join paper p
on p.studentid = s.id
and p.semesterid = s.semesterid

答案 1 :(得分:1)

students_marks表格中,您有列sem_idsessionYear。我假设您可以从sem_id找出年份,因此sessionYear列不是必需的。删除它。

现在,您可以只有一列paper_grade ,并在单独的一行中输入每篇论文。

Name        | Type 
------------|-------
mark_id     | int
student_id  | int
semester_id | int
paper_grade | int

不要担心每行重复的ID - 只要它们之间没有依赖关系,你就可以了。

我还建议将decimal(11,0)更改为int