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

时间:2017-06-03 13:53:46

标签: mysql laravel-5.3 laravel-migrations

在以下版本中设置外键约束的正确方法是什么?

假设我有模型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');

我的问题是:

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

1 个答案:

答案 0 :(得分:0)

您无需创建用于定义外键的新迁移文件。

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

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