Laravel 使用可选列的多对多关系的数据库设计?

Laravel 使用可选列的多对多关系的数据库设计?,laravel,database-design,Laravel,Database Design,我与两个表、课程和模块有数据库关系。一门课程可以有许多模块,一个模块可以属于许多课程。管理员可以将模块添加到课程中。但现在我们遇到了一个问题,尽管您可以: - Course 1 module 1 | 3 credits module 2 | 4 credits 在某些情况下,模块可以是可选的,但学生必须完成其中一项: - Course 1 module 3 | 2 credits OR module 4 | 2 credits 因此,您将看到在第一个场景中,学生必须

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

- Course 1
     module 1 | 3 credits
     module 2 | 4 credits
在某些情况下,模块可以是可选的,但学生必须完成其中一项:

- Course 1
   module 3 | 2 credits OR module 4 | 2 credits
因此,您将看到在第一个场景中,学生必须选择这两个模块来获得课程的学分,但在第二个场景中,学生可以选择模块3或模块4来获得2个学分


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

您需要一个中间表来实现多对多关系。 在这个中间表中,您可以添加一列来指定课程是否是可选的

但最终,在应用程序中,您将负责确保学生选择至少一个必修模块

你可以有这样的东西:

课程:id、姓名

模块:id、名称

课程模块:id,课程id,模块id,可选

然后,您的模型将如下所示:

class Course extends Model
{
    public function modules()
    {
        return $this->belongsToMany(Module::class)->withPivot();
    }
}
您可以通过检查来检查模块是否是必需的

$course->modules->first()->pivot->optional;

请原谅我的无知,但我不能完全想象它的结构。学分具体在哪里声明?它们是否与模块直接关联?通过多对多关系,链接是通过中间表建立的——正如@Matthias所提到的,您可以根据自己的意愿拥有任意多或任意少的交叉引用记录。学分是否以任何方式决定了给定课程需要多少模块?学分只是modules@SebastianSulinski的一个属性