Сумасшедшая структура базы данных - предложения - PullRequest
2 голосов
/ 14 апреля 2020

Я работаю над проектом, в котором мне нужно создать три отношения «многие ко многим» между 4 моделями. Вот как это происходит:

  • Категории часто задаваемых вопросов могут иметь много подкатегорий часто задаваемых вопросов и наоборот.
  • Группы часто задаваемых вопросов могут иметь много подкатегорий часто задаваемых вопросов и наоборот.
  • Часто задаваемые вопросы может иметь много групп часто задаваемых вопросов и наоборот.

Для всех экспертов по базам данных, как мне разработать эту схему базы данных в Laravel? Должен ли я иметь три разные сводные таблицы? Должен ли я использовать полиморфные c отношения?

Я уже использовал полиморфные c отношения ранее, но я изо всех сил пытаюсь реализовать их в этом сценарии.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Я бы сделал что-то вроде этого:

Таблица категорий часто задаваемых вопросов

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

Должен ли я использовать polymorphi c отношения?

Я не думаю, что полиморфные c отношения имели бы какой-то смысл в этом сценарии. Я бы придерживался стандарта многие ко многим.

В ваших модельных классах вы должны настроить все отношения, как указано в документах .

Вы можете сделать это:

FaqCategory Модель

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

Faq Модель

class Faq extends Model
{
    /**
     * Get the faq's faq groups.
     */
    public function faq_groups()
    {
        return $this->belongsToMany('App\FaqGroup');
    }
}
0 голосов
/ 14 апреля 2020

Одной из проблем является вопрос о том, должны ли категории и подкатегории FAQ быть разными таблицами. Возможно, должна быть та же таблица, чтобы дать вам возможность иметь больше уровней в будущем.

т.е.

faq_categories(id, parent_id, name etc.)

Тогда, на мой взгляд, вам нужны просто разные сводные таблицы. Я не вижу никакой причины использовать полиморфные c отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...