【问题标题】:Enforcing Database Constraints In Application Code在应用程序代码中强制执行数据库约束
【发布时间】:2011-11-18 08:51:16
【问题描述】:

我正在开发我的第一个真正的 asp.net Web 应用程序,但我对捕获和处理违反数据库约束的最佳位置和方法感到困惑。假设我对列有唯一约束,并且用户输入了违反该唯一约束的内容。我是通过调用数据库来检查该列的值是否存在,在业务层中捕获它,还是让它一直到数据库并让它抛出异常并在我的应用程序中处理它?

我不喜欢后一个答案——因为在业务层到达数据库之前尽可能多地处理它是有意义的。但这也有点问题,因为我的应用程序是由在所有表上实现基本 CRUD 操作的过程驱动的。因此,为了在业务层中强制执行唯一性,我需要为每个可能的约束创建一个过程,以便在更新或插入之前进行查找。这似乎很乏味......而且我正在复制数据库和业务层中都存在的业务规则,所以如果发生变化,我不仅必须更改数据库,而且我必须更改程序和应用代码。

那么是否有正确的方法或好方法可以在应用程序代码中强制执行这些数据库约束,或者我应该寻找一种方法来捕获数据库抛出的异常并以用户友好的方式呈现它们?

【问题讨论】:

  • 感谢您的快速回复。考虑到无论如何我都必须返回数据库来检查唯一性,这确实是有道理的。猜猜接下来要做的是弄清楚如何处理数据库异常并以用户友好的方式呈现它们,并且不会向用户暴露太多信息。
  • 关键是要接受 DBMS(顺便说一下,不是“数据库”)“业务层”的概念。谷歌搜索 Toon Koppelaars 的“赫尔辛基宣言”。他有我见过的最好的解释为什么这是最好的选择。

标签: asp.net vb.net exception-handling constraints


【解决方案1】:

后一个答案是正确的。如果您首先尝试在前端应用程序中完成所有操作,那么使用数据库约束的目的是什么?

整个约束点是要有一个中心位置(数据库服务器),以一致的方式处理尽可能多的数据验证,而不管数据如何/从哪里到达那里。在前端应用程序中重新编写相同的逻辑是多余的,而且是不必要的复杂。如果数据库中的约束发生了变化(您的应用认为应该不再有效)怎么办?无论如何你都会得到一个例外。

让数据库处理验证约束,并处理代码中的异常。这允许您用于访问和更新数据的所有方法保持一致,因为数据库会处理它。如果发生变化,您可以使用新的约束更新数据库,您的应用会自动同步。

【讨论】:

    【解决方案2】:

    鉴于您对如何使用数据库的描述,我同意后者。意识到这一点非常重要,即使您在执行更新/插入之前从业务层调用以验证每一个可能的约束违规,一瞬间数据库状态可能会由于其他用户的请求和您的更新/插入仍然可能失败。

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2010-10-05
      • 2016-03-24
      • 2011-09-07
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多