【问题标题】:Should my CRUD application perform validation on data or should it be a database operation?我的 CRUD 应用程序应该对数据执行验证还是应该是数据库操作?
【发布时间】:2020-01-07 13:45:46
【问题描述】:

我有一个简单的 CRUD 应用程序,使用关系数据库。

我的数据库设置了所有外键、唯一键等。

我的问题是,我的应用程序应该对输入数据执行验证还是应该是数据库问题?

例如,想象一个 POST,它期望另一个实体的 id,它是我数据库中的外键。

我的应用程序是否应该首先查询该 id,查看它是否存在于数据库中,如果不存在,则返回 404?还是我应该简单地尝试在数据库中插入该实体并等待 CONSTRAINT 错误?

【问题讨论】:

  • 如果您的 CRUD 应用程序是 GUI,通常会为每个有效值字段提供一个下拉列表。您的代码通过查找 FK 来获取列表,这是在有足够的输入进行验证之前。 (一些开发/数据库工具,如 MSAccess,可能会为您完成其中的一些工作。)将所有验证留给 DBMS 会很好,但通常它的错误消息并不友好。此外,您可能需要无法表示为键/FK 的约束。

标签: foreign-keys relational-database crud


【解决方案1】:

分析其他资源后,看来我应该处理约束错误。

它叫做exogenous expressions。如果我验证我的应用程序中的数据,可能会出现意外的竞争条件,另一个进程可能会更改我刚刚查询的数据。

因此,为了保持一致性,我应该捕获数据库异常并对其进行处理。

您可以了解更多关于外生表达式on this Microsoft article

【讨论】:

  • 您可以通过 Commitment Control 和/或 READ WITH LOCK 避免验证代码中的竞争条件。如果应用程序的任何事务要更新多个表或多个记录,请使用承诺控制。也就是说,当你的应用程序处于简单的 CRUD 阶段时,养成使用 Commitment Control 的习惯,它会在以后节省大量的重新设计。
猜你喜欢
  • 2020-06-30
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2021-11-06
相关资源
最近更新 更多