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

问题描述

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

如果将关系添加到迁移中,则仍然必须在模型中添加关系。

我了解在数据库层中具有关系确实会带来一些好处,例如阻止手动查询删除依赖于其他数据的数据,并提供诸如ON DELETE CASCADE功能

但是有什么最佳实践吗?

解决方法

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

他们提供了什么引用什么的一般概念

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

它们保护数据完整性

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

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

只要外键存在,任何关于外键的数据库级功能和优化都只能使用

将数据库级别的约束提升到ORM中

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

摘要

是的,您可以避免创建外键,但这不是一个好主意。首先,它看起来会很好,直到您意识到它有问题。但随后损害已经造成。最好避免这种损害,并避免外键影响本书的作用。