mysql - 一个疯狂的数据库结构 - 建议
问题描述
我正在做一个项目,我需要在 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');
});
如您所见,我不会创建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');
}
}
推荐阅读
- rx-java2 - 多播粘性可观察到订阅/处置行为
- git - 添加 ssh 密钥后,Git 卡在克隆上
- machine-learning - 响应生成如何在 RASA 核心中工作?
- node.js - 无法从 template.yml 文件注册多个选项并在 lambda api 网关上发布 api
- javascript - 我如何编码,以便单击后的按钮将用户引导到同一 html 中的页脚?
- java - java socket聊天代码抛出java.net.SocketException: Socket closed
- python - 将 Pickle 数据(python)读入 R 后数字发生变化
- linux - 如何在不重新启动或注销的情况下更新 sudo bash 中的 /etc/profile
- c# - 从十六进制转换为文本
- javascript - 将保存在 JS 中的字符串转换为 Swift 中的日期