Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 疯狂的数据库结构-建议_Mysql_Sql_Database_Laravel - Fatal编程技术网

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

Mysql 疯狂的数据库结构-建议,mysql,sql,database,laravel,Mysql,Sql,Database,Laravel,我正在从事一个项目,我需要在4个模型之间创建三个多对多关系。事情是这样的: FAQ类别可以有许多FAQ子类别,反之亦然 FAQ组可以有许多FAQ子类别,反之亦然 常见问题解答可以有许多常见问题解答组,反之亦然 对于所有的数据库专家来说,我应该如何在Laravel中设计这个数据库模式?我应该有三个不同的透视表吗?我应该使用多态关系吗 我以前使用过多态关系,但是在这个场景中我很难实现它 一个问题是FAQ类别和子类别是否应该是不同的表。也许应该是同一张表,以便让你在未来有更多的水平选择 i、 e

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

  • FAQ类别可以有许多FAQ子类别,反之亦然
  • FAQ组可以有许多FAQ子类别,反之亦然
  • 常见问题解答可以有许多常见问题解答组,反之亦然
对于所有的数据库专家来说,我应该如何在Laravel中设计这个数据库模式?我应该有三个不同的透视表吗?我应该使用多态关系吗


我以前使用过多态关系,但是在这个场景中我很难实现它

一个问题是FAQ类别和子类别是否应该是不同的表。也许应该是同一张表,以便让你在未来有更多的水平选择

i、 e


那么,在我看来,您只需要不同的透视表。我看不出有任何理由使用多态关系。

我会这样做:

常见问题分类表

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_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_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子类别表,因为让类别表引用自己到父类别(使外键可以为null以创建顶级类别也很重要)更干净

现在要设置表之间的关系,我们可以执行以下操作:

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

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

我应该使用多态关系吗

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

在模型类中,应设置所有关系,如中引用的关系

您可以这样做:

常见问题解答类别模型

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');
    }
}
常见问题解答组模型

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');
    }
}
常见问题解答模型

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

谢谢你的详细解释。我会尝试你的解决方案,并让你知道。我感谢你的帮助。