【问题标题】:Does anything bad happen if I don't set foreign key constraints in Laravel?如果我不在 Laravel 中设置外键约束,会发生什么不好的事情吗?
【发布时间】:2018-10-02 02:12:48
【问题描述】:

我知道严格来说这不是最佳实践,但在 Laravel 中设置外键始终是一个巨大的痛苦。

像这样简单的事情可能在 70% 的情况下都失败了。有时有充分的理由,有时只是……因为感觉像。自然也没有有意义的错误信息。

    Schema::table('accounts', function(Blueprint $table){
        $table->integer('package_id')->unsigned();
        $table->foreign('package_id')->references('id')->on('packages')->onDelete('set null');
    });

现在,应用程序运行良好,所有关系都正常在数据库中设置外键,那么完全忽略它们有什么实际危害吗?

【问题讨论】:

  • 该设置失败是因为您在 Non Nullable 字段(package_id)上使用了Set Null。使用$table->integer('package_id')->unsigned()->nullable() 或对onDelete 使用不同的约束,例如onDelete('cascade')
  • -1 因为问题是在提倡编程中的不良做法和懒惰。而不是问这个,OP 应该搜索材料,看看在 DB 中设置良好的关系有什么好处。非常颠倒的思维方式,我会说从懒惰来看,阅读这篇文章可能会得出什么结论。

标签: laravel eloquent


【解决方案1】:

这个 Laravel 语法 $table->foreign('package_id')->references('id')->on('packages')->onDelete('set null') 做了两个主要的事情:

  1. 创建外键(及其约束)。这样做的好处是数据一致性(ACID 中的 C)。不使用外键意味着 DBMS 不能保证表的一致性(例如,packages 指的是已删除的accounts)。如果数据一致性不是真正需要或由其他层(例如应用程序层)处理,这可能不是问题。阅读此answer 了解更多详情。
  2. 创建外键索引。好处是使用外键的查询性能更好(在本例中为package_id)。当行数很大时,这种好处变得更加显着。如果表不会存储大量行,您可以忽略这一点。在article 中阅读更多详细信息。

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2011-08-06
    相关资源
    最近更新 更多