数据库设计与可选列的多对多关系?

时间:2018-09-07 14:32:34

标签: laravel database-design

我与两个表,课程和模块有数据库关系。一门课程可以具有许多模块,而一个模块可以属于许多课程。管理员可以将模块添加到课程中。但是,即使您可以遇到问题,我们现在还是有一个问题:

- Course 1
     module 1 | 3 credits
     module 2 | 4 credits

在某些情况下,模块可以是可选的,但学生必须执行其中之一:

- Course 1
   module 3 | 2 credits OR module 4 | 2 credits

因此,您将在第一种情况下看到学生必须同时选择这两个模块来获得该课程的学分,但是在第二种情况下,学生可以选择模块3或模块4来获得这2个学分。 / p>

所以我的问题是我现在不知道如何形成课程和模块之间的关系,因为有些模块可以是可选的,但至少是一个必需的。

1 个答案:

答案 0 :(得分:1)

您将需要一个中间表来实现many to many关系。 在此中间表中,您可以添加一列以指定课程是否为optional

但是最终,由您自己决定在应用程序中确保学生选择至少一个必修的模块。

您可能会遇到类似的事情:

courses: id, name

modules: id, name

course_module: id, course_id, module_id, optional

您的模型将如下所示:

class Course extends Model
{
    public function modules()
    {
        return $this->belongsToMany(Module::class)->withPivot();
    }
}

然后您将通过检查

来检查模块是否是必需的
$course->modules->first()->pivot->optional;