外键还是没有外键?定义Laravel关系

时间:2016-05-01 08:00:12

标签: laravel laravel-5 eloquent laravel-5.2

定义外键 VS 仅创建名为user_id的整数列有什么区别?

// create_posts migrations
$table->integer('user_id')->unsigned();
// vs
$table->foreign('user_id')->references('id')->on('users');

它们可以互换使用吗?每个人服务的目的是什么?哪个被认为是最佳实践,第一或第二定义?

修改

命令$post->user()将以任何方式工作,那么外键的使用会带来什么好处呢?

4 个答案:

答案 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.

正如您从命令解释中看到的那样它们不可互换,您需要先命令第二个命令没有第一个命令会抱怨

最佳做法同时使用

下面列出的优点很少:

  1. 您可以实施 级联更新/删除
  2. 数据库级别验证 仅记录有效的user_id值(以避免某些人输入可能无效或不存在的user_id的999999)。
  3. 以上两个是主要优点,你可以表达多种场景,以上两个如何成为生命救星。

    让我们在帖子表中说出人为错误或脚本制作者中的错误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');

不要将索引的定义与外键混合,它们的含义并不相同。