Php 我如何才能使这个概念模型更好?

Php 我如何才能使这个概念模型更好?,php,mysql,laravel,Php,Mysql,Laravel,好朋友。我正在开发一个类似于我国学校学生管理系统的Laravel应用程序。该应用程序要求我存储学生的分数,并进一步生成学生获得该分数期间或学期的报告 在我的国家,一学年通常有六(6)节课。一个周期为4周。此外,一学年有两(2)个学期,为期3个半月。每学期有四(4)学期 下面是一幅解释事物外观的图片: 由于我必须为每个学生生成一份给定学期的报告,因此我的概念模型是这样的: 学生表: students -------- id * name grade_id (fk) 主题表: subjects

好朋友。我正在开发一个类似于我国学校学生管理系统的Laravel应用程序。该应用程序要求我存储学生的分数,并进一步生成学生获得该分数期间或学期的报告

在我的国家,一学年通常有六(6)节课。一个周期为4周。此外,一学年有两(2)个学期,为期3个半月。每学期有四(4)学期

下面是一幅解释事物外观的图片:

由于我必须为每个学生生成一份给定学期的报告,因此我的概念模型是这样的:

学生表:

students
--------
id *
name
grade_id (fk)
主题表:

subjects
--------
id *
name
等级表:

grades
--------
id *
name
注意成绩表存储学校每个班级的名称。例如
12级
11级

现在,这些是存储在给定时期或学期的学生成绩表

period_one (1st Period)
-----------------------
id *
student_id (fk)
subject_id (fk)
grade_id (fk)
score

first_exam (1st Sem. Exam)
-----------------------
id *
student_id (fk)
subject_id (fk)
grade_id (fk)
score

period_four (4th Period)
-----------------------
id *
student_id (fk)
subject_id (fk)
grade_id (fk)
score
注意同样适用于
第二时段
第三时段
第五时段
第六时段


到现在为止,我知道有人在这里看到了一些可疑或不聪明的东西。我在每个表中重复相同的列,我相信可以做得更好

但我这样做是有原因的,这与生成报告有关。通过以上设置,我可以轻松地构造查询以生成报告

这是我用来生成定期报告的查询

// the function runs a select all query for all the period/term grades tables
// It displays the periodic grades sheet

$student_id = 1; // any id could be passed
$term = "period_one"; // giving the exact table name to fetch record from
$class_id = 2; // 2 may represent grade 12 in this case.

function periodic_report($term, $student_id, $class_id)
{
    global $connection;
    $query = "SELECT $table.student_id, score, subject_name, class_name
                from $term
                INNER JOIN students
                        ON students.student_id = $table.student_id
                    INNER JOIN classes
                        ON classes.class_id = $table.class_id
                    INNER JOIN subjects
                        ON subjects.subject_id = $table.subject_id
              WHERE $table.student_id = $student_id AND $table.class_id = $class_id";

    $result_set = mysqli_query($connection, $query);

    // Test if there was a query/syntax error
    confirm_query($result_set);
    return $result_set;
}
结果可能是这样的:

查询以生成第一学期报告:

// the function runs a select all query for semester grades
// It displays the first semester grades sheet
function first_semester_report($student_id) {
    global $connection;
    $query = "SELECT subjects.subject_name, period_one.score, period_two.score, period_three.score, first_exam.score
        FROM subjects

        LEFT JOIN period_one 
            ON period_one.subject_id = subjects.subject_id 
            AND period_one.student_id = {$student_id}

        LEFT JOIN period_two 
            ON period_two.subject_id = subjects.subject_id 
            AND period_two.student_id = {$student_id}

        LEFT JOIN period_three
            ON period_three.subject_id = subjects.subject_id 
            AND period_three.student_id = {$student_id}

        LEFT JOIN first_exam
            ON first_exam.subject_id = subjects.subject_id 
            AND first_exam.student_id = {$student_id}

        LEFT JOIN students
            ON students.student_id = {$student_id}

        WHERE period_one.subject_id = subjects.subject_id OR period_two.subject_id = subjects.subject_id OR period_three.subject_id = subjects.subject_id OR first_exam.subject_id = subjects.subject_id
        ORDER BY subjects.subject_name";      

    $result_set = mysqli_query($connection, $query);

    if(!$result_set){
        die("Database query failed. Error from first semester report: ".mysqli_error($connection)." Error number is: ".mysqli_errno($connection));
    }


    // Test if there was a query/syntax error
    //confirm_query($result_set);
    return $result_set;
}
生成第二学期报告的查询:

// the function runs a select all query for semester grades
// It displays the second semester grades sheet
function second_semester_report($student_id) {
    global $connection;
    $query = "SELECT subjects.subject_name, period_four.score, period_five.score, period_six.score, second_exam.score
        FROM subjects

        LEFT JOIN period_four 
            ON period_four.subject_id = subjects.subject_id 
            AND period_four.student_id = {$student_id}

        LEFT JOIN period_five 
            ON period_five.subject_id = subjects.subject_id 
            AND period_five.student_id = {$student_id}

        LEFT JOIN period_six
            ON period_six.subject_id = subjects.subject_id 
            AND period_six.student_id = {$student_id}

        LEFT JOIN second_exam
            ON second_exam.subject_id = subjects.subject_id 
            AND second_exam.student_id = {$student_id}

        LEFT JOIN students
            ON students.student_id = {$student_id}

        WHERE period_four.subject_id = subjects.subject_id OR period_five.subject_id = subjects.subject_id OR period_six.subject_id = subjects.subject_id OR second_exam.subject_id = subjects.subject_id
        ORDER BY subjects.subject_name";      

    $result_set = mysqli_query($connection, $query);

    if(!$result_set){
        die("Database query failed. Error from second semester report: ".mysqli_error($connection)." Error number is: ".mysqli_errno($connection));
    }


    // Test if there was a query/syntax error
    //confirm_query($result_set);
    return $result_set;
}
这是基于以下学期查询的学期报告的外观:

有时候,我很难做到更好,但遗憾的是,我不知道怎么做

有更好的方法吗?此外,只有70%的学校在其他学校使用不同的方式安排学年。有没有一种方法可以定制这一点,即学校可以指定学年中的时段或学期,并为每个时段或学期创建一个表格


将感谢实际影响和建议。谢谢

“这个时候我知道有人看到了可疑的东西”你完全正确。这些应该只是一个带有Id的表
period
,或者“enum”来标识该期间。还有你的第一次考试表,我猜你还有第二次考试,诸如此类,同样适用于这里。它们应该只有一张桌子。至于您的陈述:“通过上述设置,我可以轻松地构造查询以生成报告。”通过良好的规范化结构,您可以做得更轻松。@JorgeCampos,请您实际演示如何操作。他只是建议您可以采取两个实际步骤。不过,首先,学习数据库建模、实体关系和规范化的一般主题,然后您将更好地理解如何构建您创建的任何数据库。在此之前,您可以在这里应用一个简单的原则:如果您发现自己在多个表中重复相同的列名,那么这些表很有可能被合并,也许可以使用一个额外的列作为属性来区分它是哪种行。例如,这适用于你的课时表。学生表和科目表看起来都不错,所有学生都在一个表中,所有科目都在一个表中。因此,考虑这些时期都是一种事物(只是按日期变化),因此都在一个表中,而考试都是一种事物(只是根据主题而变化),因此它们都属于一个表。“我知道我可以很容易地创建一个这样的表:<代码>等级。(id、studentId、subjectId、Period1、Period2、Period3、periodOfour等)但我主要关心的是生成报告。我如何按照你们建议的新方式采纳我现在的查询?