定义外键 VS 仅创建名为user_id
的整数列有什么区别?
// create_posts migrations
$table->integer('user_id')->unsigned();
// vs
$table->foreign('user_id')->references('id')->on('users');
它们可以互换使用吗?每个人服务的目的是什么?哪个被认为是最佳实践,第一或第二定义?
命令$post->user()
将以任何方式工作,那么外键的使用会带来什么好处呢?
答案 0 :(得分:3)
$table->integer('user_id')->unsigned();
// Above command is creating a column in database and it is required to have the required table structure
$table->foreign('user_id')->references('id')->on('users');
// Above command is creating foreign key index and making reference to id in users table.
正如您从命令解释中看到的那样它们不可互换,您需要先命令第二个命令没有第一个命令会抱怨。
最佳做法是同时使用。
下面列出的优点很少:
以上两个是主要优点,你可以表达多种场景,以上两个如何成为生命救星。
让我们在帖子表中说出人为错误或脚本制作者中的错误user_id = 9999.你认为$ post-> user()会怎么做?
除非您可以在没有任何用户引用的情况下发帖,否则您可能会发现如果不使用外键可能会出现多个逻辑问题。
将外键视为执行关系并在从db中删除/删除用户时处理帖子。
答案 1 :(得分:0)
不,它们不能互换使用,每个都有它的用法。如果要在列上定义索引,请使用索引,表示数据库索引,请参阅here。但是当你定义一个外键时,它会为该列设置一个索引(用于搜索,...),并在user表中的user_id和id列之间建立关系,所以如果有一个id为10的用户,那么你可以使用另一个表上的user_id = 10。此外,它还有另一个好处,例如确保您的数据已集成。例如,如果存在属于该用户的文章,则您无法通过ID 10删除用户。有关详细信息see this。
答案 2 :(得分:-1)
第一行,只会创建一个user_id列而不是特殊的, 而另一行将创建一个列作为外键,它将与用户表的id列紧密耦合,这将产生一些限制。 了解外键reference
答案 3 :(得分:-1)
对于我总是使用的最佳实践:
$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
不要将索引的定义与外键混合,它们的含义并不相同。