PHP/MYSQL-如何在应用程序中处理数据库级约束

PHP/MYSQL-如何在应用程序中处理数据库级约束,php,mysql,database,database-design,orm,Php,Mysql,Database,Database Design,Orm,我已经看过并看到了相关的问题——在应用程序中处理数据库约束与本机数据库约束的一般问题,但我的问题更为尖锐和具体,涉及如何在用PHP编写的应用程序逻辑中处理本机mysql约束 在其他语言/数据库包装器中(例如ADO.NET),您将数据库交互放在try/catch中,它会抛出一个适当的异常,php是这样吗 此外,使用严格的ORM是否可以消除对数据库级约束的需要 在其他语言/数据库包装中, (例如ADO.NET)您将 数据库中的数据库交互 试一试/接球,它会抛出一个正确的球 例外,php就是这样吗 它

我已经看过并看到了相关的问题——在应用程序中处理数据库约束与本机数据库约束的一般问题,但我的问题更为尖锐和具体,涉及如何在用PHP编写的应用程序逻辑中处理本机mysql约束

在其他语言/数据库包装器中(例如ADO.NET),您将数据库交互放在try/catch中,它会抛出一个适当的异常,php是这样吗

此外,使用严格的ORM是否可以消除对数据库级约束的需要

在其他语言/数据库包装中, (例如ADO.NET)您将 数据库中的数据库交互 试一试/接球,它会抛出一个正确的球 例外,php就是这样吗

它与PDO有关。。。我想是Mysqli,但我已经好几年没用了,所以我可能错了。但是它只抛出一个异常。。。没有特定的异常类型,例如“重复密钥”或“非空”。。。您必须从异常的消息/代码中解析这些内容

另外,使用严格的ORM 消除对数据库级别的需求 约束条件


我会说不。一般来说,如果可以的话,最好让db来处理,因为如果你用PHP来模拟,你会有更多的开销。

try/catch块的伟大神话是程序员将产生惊人的健壮代码,并且实际上能够从失败的数据库查询中恢复。但是从db错误中恢复的能力取决于首先发生的错误类型——如果有sql语法错误,那么代码是来自用户键入的查询,还是来自生成查询的某个子例程?如果它来自代码,而不是用户,那么再次调用代码只会再次产生相同的错误,因此使用try/catch块从一开始就注定失败,查询永远不会运行。这通常是您从运行在web服务器上的PHP脚本中获得的代码类型,您运行一个查询,它失败,您升级失败并放弃。另一方面,如果您正在用PHP编写一个交互式应用程序,并且需要正确地处理数据库错误,比如一个试图通过随机变异(一个非常奇怪的例子,但无论如何)来进化有效SQL语句的遗传算法,那么您将从try/catch块中获得一些好处

这也适用于数据库级别的约束。如果您有一些长期运行的应用程序需要优雅地处理约束冲突,那么您必须自己构建健壮性。但是我想很少有人用这种方式使用PHP,99%的PHP都是用来转储网页的,各种包装器和表单在他们的设计中反映了这一点。使用.NET构建需要错误恢复逻辑的独立应用程序的可能性要大得多


这又引出了原始问题的一个变体,即何时使用或为什么使用数据库约束?当您有一个高度动态的数据库结构时,它们最有用,在编译时,表之间的关系是未知的,也就是说,当新表作为应用程序本身的一部分被创建或修改时。你可能希望这是一个庞大的数据仓库,或者数据挖掘,或者弦论。

好吧,我想我对ORM评论的观点是,我相信在使用ORM时已经存在开销,那么为什么要在数据库中复制它呢。这取决于ORM的设计方式。。。例如,仅当您将条令1.2配置为进行仿真,或者db/引擎不支持它们时,条令1.2才会进行仿真。因此,使用具有本机支持的db使ORM在这方面的性能更高。