Eloquent 可以替换数据库中的外键吗?

Posted

技术标签:

【中文标题】Eloquent 可以替换数据库中的外键吗?【英文标题】:Can Eloquent replace foreign keys in the database? 【发布时间】:2020-12-21 10:58:00 【问题描述】:

当 Eloquent 通过hasMany()belongsTo() 等提供的模型关系很好地处理关系时,是否真的需要通过迁移向数据库添加外键?

如果将关系添加到迁移中,您仍然需要在模型中添加关系。

我知道在数据库层中建立关系确实提供了一些好处,例如阻止手动查询删除依赖于其他数据的数据,并提供 ON DELETE CASCADE.. 等功能

但是有什么最佳实践吗?

【问题讨论】:

【参考方案1】:

这是概念上的必要性,而不是技术上的必要性。外键是参考。不添加外键意味着您的数据库中没有引用。我认为不创建您知道的外键约束是非常不合标准的。外键的一些好处:

它们提供了关于什么引用了什么的一般概念

数据库管理员在分析您的数据库时不一定会使用您的 ORM。拥有外键可以提供一些非常有用的信息。

它们保护数据完整性

数据库强制执行外键约束。如果数据库没有该约束,那么您的 ORM 代码必须是完美的,以保护数据库免受某些问题的影响。当您在一个团队中工作并且有一些单独的分支时,这几乎是不可能的。无论如何,有些错误迟早会出现。如果您有外键约束,那么您可能会遇到错误,而不是丢失或损坏信息。而且我没有提到您的 ORM 中可能存在的错误。

您谈到了手动查询,但它们只是您的问题空间的一小部分。您可能有触发器、存储过程、连接到数据库的不同应用程序、应用程序中的硬编码查询等等。当您避免创建外键时,您敢打赌,即使在遥不可及的未来,这也是不必要的,这当然是您不应该做出的假设。

外键的任何 db 级特性和优化只能在外键存在的情况下使用

将 db 级约束提升到 ORM

通常是个坏主意。除了您的应用程序代码将是您自己的防御不一定发生在该级别的问题之外,这样您就有了不存在的事实上的约束。你的技术栈将不再是一个栈,而是一些有循环的图。

总结

是的,您可以避免创建外键,但这是个坏主意。一开始它看起来不错,直到你意识到它有问题。但是,损害已经造成。最好避免这种损坏,并在外键方面按本书行事。

【讨论】:

以上是关于Eloquent 可以替换数据库中的外键吗?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle一个字段的的外键可以当另一个字段的主键吗

我应该索引一个经常更新的外键吗

我可以在我的大多数表中使用我的外键作为我的主键吗?

数据表中与主键联系的外键字段必须于主键同名吗

从刀片中的外键获取数据

OrmLite可以为除主键之外的属性指定外键吗