【发布时间】:2017-11-04 19:02:44
【问题描述】:
设置外键限制的正确方法是什么?
假设我有模型Post、User、Tag。
目前我的迁移都设置为:
对于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
假设对于多对多关系,我在 Posts 和 Tags 之间有一个数据透视表:
$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(粗略估计并在下一行优化中,我将致力于缓存查询,因此不确定这些信息的相关性)
【问题讨论】:
标签: mysql laravel-5.3 laravel-migrations