在以下版本中设置外键约束的正确方法是什么?
假设我有模型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');
我的问题是:
$table->foreign('something_id')->references('id')->on('somethings');
获得任何东西,因为这里的基数大约是7.5吗?更新comments.something_id
将永远不会在我的应用中发生,并且“创建新something
行”与“从something
行读取相关comment
行”的比例确实如此低1:10 ^ 5(粗略估计,在下一行优化中,我将处理缓存查询,因此不确定这些信息的相关性)答案 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');
在数据透视表迁移文件中。