首页 > 解决方案 > 一个疯狂的数据库结构 - 建议

问题描述

我正在做一个项目,我需要在 4 个模型之间创建三个多对多关系。这是怎么回事:

对于所有的数据库专家,我应该如何在 Laravel 中设计这个数据库模式?我应该有三个不同的数据透视表吗?我应该使用多态关系吗?

我以前使用过多态关系,但在这种情况下我很难实现它。

标签: mysqlsqldatabaselaravel

解决方案


我会做这样的事情:

常见问题类别表

Schema::create('faq_categories', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
});

Schema::table('faq_categories', function (Blueprint $table) {
    $table->unsignedInteger('parent_id')->nullable();
    $table->foreign('parent_id')->references('id')->on('faq_categories')->onDelete('cascade');
});

常见问题组表

Schema::create('faq_groups', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
});

常见问题表

Schema::create('faqs', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
});

如您所见,我不会创建FAQ 子类别表,因为让类别表将自身引用到父类别更简洁(使外键可以为空以创建顶级类别也很重要)。

现在要设置表之间的关系,我们可以这样做:

常见问题类别 - 常见问题组(多对多)

Schema::create('faq_category_faq_group', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('faq_category_id');
    $table->foreign('faq_category_id')->refrences('id')->on('faq_categories')->onDelete('cascade');
    $table->unsignedInteger('faq_group_id');
    $table->foreign('faq_group_id')->refrences('id')->on('faq_groups')->onDelete('cascade');
});

常见问题 - 常见问题组(多对多)

Schema::create('faq_faq_group', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('faq_id');
    $table->foreign('faq_id')->refrences('id')->on('faqs')->onDelete('cascade');
    $table->unsignedInteger('faq_group_id');
    $table->foreign('faq_group_id')->refrences('id')->on('faq_groups')->onDelete('cascade');
});

我应该使用多态关系吗?

我认为多态关系在这种情况下没有任何意义。我会坚持标准的多对多。

在您的模型类中,您应该设置文档中引用的所有关系。

你可以这样做:

常见问题类别模型

class FaqCategory extends Model
{
    /**
     * Get the category's parent category.
     */
    public function parent()
    {
        return $this->belongsTo('App\FaqCategory');
    }

    /**
     * Get the category's sub categories.
     */
    public function sub_categories()
    {
        return $this->hasMany('App\FaqCategory', 'parent_id');
    }

    /**
     * Get the category's faq groups.
     */
    public function faq_groups()
    {
        return $this->belongsToMany('App\FaqGroup');
    }
}

常见问题组模型

class FaqGroup extends Model
{
    /**
     * Get the group's faq categories.
     */
    public function faq_categories()
    {
        return $this->belongsToMany('App\FaqCategory');
    }

    /**
     * Get the group's faqs.
     */
    public function faqs()
    {
        return $this->belongsToMany('App\Faq');
    }
}

常见问题解答模型

class Faq extends Model
{
    /**
     * Get the faq's faq groups.
     */
    public function faq_groups()
    {
        return $this->belongsToMany('App\FaqGroup');
    }
}

推荐阅读