mysql - 疯狂的数据库结构 - 建议

标签 mysql sql database laravel

我正在开发一个项目,需要在 4 个模型之间创建三个多对多关系。事情是这样的:

  • 常见问题解答类别可以有许多常见问题解答子类别,反之亦然。
  • 常见问题解答组可以有许多常见问题解答子类别,反之亦然。
  • 常见问题解答可以有多个常见问题解答组,反之亦然。

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

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

最佳答案

我会做这样的事情:

常见问题解答类别表

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');
});

正如您所看到的,我不会创建常见问题解答子类别表,因为拥有一个引用父类别的类别表会更干净(对于使外键可以为空以便能够创建顶级类别也很重要) )。

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

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

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');
});

Should I use polymorphic relationships?

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

在您的模型类中,您应该设置所有关系,如docs中引用的那样。 .

你可以这样做:

常见问题类别模型

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');
    }
}

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');
    }
}

关于mysql - 疯狂的数据库结构 - 建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61212874/

相关文章:

mysql - 从多个 SQL 文件恢复 SQL

mysql - 每年的 SQL 事务总和

sql - 使用另一个表作为随机值集合而不使用循环随机更新一组值的方法?

mysql 关系表

mysql - 创建存储过程时出错

mysql - 如何使 MySQL 中的用户表最容易搜索?

mysql - sql插入一直报错

mysql - SQL Server 迁移到 mySQL、提示和潜在问题?

php - 具有虚拟模型属性的 CDbCriteria

database - 无法更改复合类型,因为列正在使用它