Php 我应该在哪里管理数据库的一致性?

Php 我应该在哪里管理数据库的一致性?,php,mysql,sql,laravel,Php,Mysql,Sql,Laravel,我想了解与使用SQL特性相比,在代码中管理数据库一致性的优点/缺点 我只是想解释一下: 一致性意味着,如果我有用户,每个用户都有相册,每个相册都有图像,那么删除一个用户意味着删除(或软删除)所有相册和图像。这也可能意味着在主键上有每个用户和每个相册的顺序ID的图像 In-code意味着在我的框架代码中使用“on-inserted,deleted,updated”事件(例如,elount) sql特性意味着使用级联、触发器等 人们抱怨这是基于意见的,但事实并非如此。如果使用mysql shell,

我想了解与使用SQL特性相比,在代码中管理数据库一致性的优点/缺点

我只是想解释一下: 一致性意味着,如果我有用户,每个用户都有相册,每个相册都有图像,那么删除一个用户意味着删除(或软删除)所有相册和图像。这也可能意味着在主键上有每个用户和每个相册的顺序ID的图像

In-code意味着在我的框架代码中使用“on-inserted,deleted,updated”事件(例如,elount)

sql特性意味着使用级联、触发器等

人们抱怨这是基于意见的,但事实并非如此。如果使用mysql shell,只应用代码规则而不应用约束可能会导致不一致性,这是事实。 另外,如果有人链接到最佳实践和参考资料,那也很好,我真的很想知道谷歌的开发人员做了什么,例如,再一次


编辑:拼写、格式、请求根据问题的实际措辞重新打开。

一般来说,最好利用诸如cascade之类的外键约束。它简单、高效且一致

在你的相册桌上有这样的东西

FOREIGN KEY (uid) REFERENCES User(id) 
ON DELETE CASCADE 

一旦用户表中的“id”行被删除,这将删除相册表中引用用户表中特定“id”的所有条目。

这取决于具体情况,但这里您有一些想法:

  • 逻辑置于DB
    • 对开发人员来说更容易(你把它放在DB上就忘了)
  • 放在代码上的逻辑
    • 如果您想要纯面向对象,那么对象应该具有所有业务逻辑
    • 如果将来您更改持久性马达(例如,更改为面向对象的DB,那么您将需要在代码中使用此逻辑)
  • 放在两个位置:
    • 对我来说,更好的解决方案是将其放在数据库中,因为它成本低,而且对我来说,面向对象的编码将不与持久性(ORM)耦合

乔迪·马丁内斯这是一个备受争议的话题。我与大多数其他开发人员的观点完全不同(如上所示)。也许还是值得一试:

我将始终管理应用程序代码中所有数据的一致性,并且不使用外键或其他约束

原因如下:

  • 一个代码位置。我所有的逻辑都应该放在一个地方。如果您将逻辑扩展到多个地方,开发人员将倾向于在将来忘记它们,这将严重削弱数据库的一致性。顺便说一句,这也是我永远不会拥有存储过程的原因

  • 在应用程序中仍然需要如果您在数据库中执行一致性检查,您仍然需要在应用程序中检查相同的约束。您需要这样做,以允许应用程序向用户显示漂亮的错误并强制执行逻辑约束。因此,如果您需要它们,为什么还要在数据库中再次复制相同的规则呢?这导致了冗余逻辑,这导致了容易遗忘的逻辑,这导致了严重的一致性

  • 非常不切实际是否尝试过进行数据库转储,然后将其重新导入数据库?你会很难熬的。表在导入期间经常违反约束,不同的系统不允许在导入期间忽略约束。通过数据库工具动态地管理数据修复也可能是一件非常痛苦的事情。因此,它严重影响了您的管理性能在一个坏的方式

是的,不管怎么说,使用约束可能是有原因的,但如果它们能够反驳以上三点,它们必须是非常有力的理由。

A Laravel答案 既然你在这个问题上加了标签,我将给你一个支持Laravel开发风格的答案。Laravel通过Artisan支持雄辩的ORM和数据库迁移。这将允许您在代码中保持这种“一致性”,而不是严格地在数据库中

奥姆 有大量的资源可用于理解ORM是什么以及它是如何工作的。Laravel使用并允许您为模型及其元素强制执行关系和规则

迁移 使用我们可以以一种对我们的模型有意义的方式构建我们的数据库,同时保持它在大多数数据库(MySQL和Postgres)之间的可移植性

多开发者应用程序 由多个开发人员开发的应用程序需要一种保持同步的方法。如果一个开发人员决定添加具有特定约束的表,则需要与团队的其他成员进行沟通。将规则直接添加到数据库可能会导致与其他团队成员通信时出现问题,并会导致头痛。相反,使用迁移和ORM来描述发生了什么变化以及为什么会发生变化。迁移将允许任何其他开发人员简单地将他们的数据库“迁移”到最新版本并保持同步

结论 要将点与列出的其他一些答案进行比较,请执行以下操作:

  • 所有代码仍然在一个地方。迁移和模型是用PHP进行的,并保存在您的项目repo中
  • 由于ORM和迁移的DB规则,它已经在应用程序中强制执行了
  • 实用因为在Laravel社区中有大量关于这些主题的文档和帮助,这可以说是进行此操作的“官方”方法
  • KISS这将使一切变得简单,特别是当您与其他开发人员和环境打交道时,因为它非常便携

在代码中执行此操作,您的数据库就被扭曲了。任何人都可以使用MySQL命令行执行此操作delete@MarkBaker看来你对这个问题可能有一些有趣的意见,你能再多写一些吗?如您所见,有一个带有3个项目符号的专业代码答案