首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >疯狂的数据库结构-建议

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

Stack Overflow用户
提问于 2020-04-14 16:45:17
回答 2查看 82关注 0票数 2

我正在做一个项目,我需要在4个模型之间建立三个多到多的关系。情况如下:

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2020-04-14 17:31:12

我会这样做:

常见问题分类表

代码语言:javascript
复制
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');
});

常见问题组表

代码语言:javascript
复制
Schema::create('faq_groups', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
});

常见问题表

代码语言:javascript
复制
Schema::create('faqs', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
});

正如您所看到的,我不会创建FAQ子类别表,因为让类别表引用父类别(使外键为空以便能够创建顶级类别也很重要)是比较干净的。

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

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

代码语言:javascript
复制
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');
});

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

代码语言:javascript
复制
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');
});

我应该使用多态关系吗?

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

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

你可以这样做:

FaqCategory模型

代码语言:javascript
复制
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模型

代码语言:javascript
复制
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');
    }
}

Faq模型

代码语言:javascript
复制
class Faq extends Model
{
    /**
     * Get the faq's faq groups.
     */
    public function faq_groups()
    {
        return $this->belongsToMany('App\FaqGroup');
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-04-14 17:02:47

一个问题是FAQ类别和子类别是否应该是不同的表。也许应该是同一个表,这样你就可以选择在将来有更多的等级了。

代码语言:javascript
复制
faq_categories(id, parent_id, name etc.)

然后,在我看来,你只需要不同的枢轴表。我看不出有什么理由使用多态关系。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61212874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档