Laravel 5.3,MySQL,迁移中正确的外键设置(一对多,多对多)

Posted

技术标签:

【中文标题】Laravel 5.3,MySQL,迁移中正确的外键设置(一对多,多对多)【英文标题】:Laravel 5.3, MySQL, proper foreign key setup in migrations (one to many, many to many) 【发布时间】:2017-11-04 19:02:44 【问题描述】:

设置外键限制的正确方法是什么?

假设我有模型PostUserTag

目前我的迁移都设置为:

对于Comment 型号:

$table->integer('posts_id')->unsigned(); //comment must belong to a post
$table->integer('user_id')->nullable()->unsigned(); //comment can belong to an user
$table->integer('something_id')->unsigned(); // each Something model will have at most 5 to 10 comments in it - this is what is called cardinality if I got it right so the average cardinality is 7.5

假设对于多对多关系,我在 PostsTags 之间有一个数据透视表:

$table->integer('post_id')->unsigned(); //connecting the post
$table->integer('tag_id')->unsigned(); //connecting the tag

现在我需要对字段进行索引,以便在执行我的数据库查询时尽可能快地执行它们。

我现在要做的是创建新的迁移:

$table->foreign('posts_id')->references('id')->on('posts');
$table->foreign('user_id')->references('id')->on('users'); 
$table->foreign('something_id')->references('id')->on('somethings');

数据透视表也是如此:

$table->foreign('post_id')->references('id')->on('posts');
$table->foreign('tag_id')->references('id')->on('tags');

我的问题是:

这是正确的方法吗?如果不是,我应该怎么做? 这里是否有一些限制、缺点或任何我应该注意的事项? 由于这里的基数约为 7.5,我会通过执行 $table->foreign('something_id')->references('id')->on('somethings'); 获得什么吗? comments.something_id 的更新永远不会在我的应用程序中发生,并且“创建新的 something 行”与“从 comment 行读取相关的 something 行”的比率非常低 1:10^5(粗略估计并在下一行优化中,我将致力于缓存查询,因此不确定这些信息的相关性)

【问题讨论】:

【参考方案1】:

您不需要创建新的迁移文件来定义外键。

$table->foreign('posts_id')->references('id')->on('posts');
$table->foreign('user_id')->references('id')->on('users'); 
$table->foreign('something_id')->references('id')->on('somethings');

将那些放在注释表迁移文件中。和

$table->foreign('post_id')->references('id')->on('posts');
$table->foreign('tag_id')->references('id')->on('tags');

在数据透视表迁移文件中。

【讨论】:

以上是关于Laravel 5.3,MySQL,迁移中正确的外键设置(一对多,多对多)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4迁移问题中的外键

Laravel 8.X Eloquent 中数据库迁移的正确外键约束语法是啥?

如何修复laravel迁移中的外键错误

无法在 Laravel 5.3 迁移中应用约束/外部

:完整性约束违规:1452 无法添加或更新子行:laravel 迁移中的外键约束失败

工匠迁移:laravel 5.3 中的回滚错误