Php 我应该在哪里管理数据库的一致性?
我想了解与使用SQL特性相比,在代码中管理数据库一致性的优点/缺点 我只是想解释一下: 一致性意味着,如果我有用户,每个用户都有相册,每个相册都有图像,那么删除一个用户意味着删除(或软删除)所有相册和图像。这也可能意味着在主键上有每个用户和每个相册的顺序ID的图像 In-code意味着在我的框架代码中使用“on-inserted,deleted,updated”事件(例如,elount) sql特性意味着使用级联、触发器等 人们抱怨这是基于意见的,但事实并非如此。如果使用mysql shell,只应用代码规则而不应用约束可能会导致不一致性,这是事实。 另外,如果有人链接到最佳实践和参考资料,那也很好,我真的很想知道谷歌的开发人员做了什么,例如,再一次Php 我应该在哪里管理数据库的一致性?,php,mysql,sql,laravel,Php,Mysql,Sql,Laravel,我想了解与使用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)耦合
乔迪·马丁内斯这是一个备受争议的话题。我与大多数其他开发人员的观点完全不同(如上所示)。也许还是值得一试: 我将始终管理应用程序代码中所有数据的一致性,并且不使用外键或其他约束 原因如下:
- 一个代码位置。我所有的逻辑都应该放在一个地方。如果您将逻辑扩展到多个地方,开发人员将倾向于在将来忘记它们,这将严重削弱数据库的一致性。顺便说一句,这也是我永远不会拥有存储过程的原因
- 在应用程序中仍然需要如果您在数据库中执行一致性检查,您仍然需要在应用程序中检查相同的约束。您需要这样做,以允许应用程序向用户显示漂亮的错误并强制执行逻辑约束。因此,如果您需要它们,为什么还要在数据库中再次复制相同的规则呢?这导致了冗余逻辑,这导致了容易遗忘的逻辑,这导致了严重的一致性
- 非常不切实际是否尝试过进行数据库转储,然后将其重新导入数据库?你会很难熬的。表在导入期间经常违反约束,不同的系统不允许在导入期间忽略约束。通过数据库工具动态地管理数据修复也可能是一件非常痛苦的事情。因此,它严重影响了您的管理性能在一个坏的方式
- 所有代码仍然在一个地方。迁移和模型是用PHP进行的,并保存在您的项目repo中
- 由于ORM和迁移的DB规则,它已经在应用程序中强制执行了
- 实用因为在Laravel社区中有大量关于这些主题的文档和帮助,这可以说是进行此操作的“官方”方法
- KISS这将使一切变得简单,特别是当您与其他开发人员和环境打交道时,因为它非常便携