Database 数据验证应该在哪里进行?

Database 数据验证应该在哪里进行?,database,validation,n-tier-architecture,Database,Validation,N Tier Architecture,我读过关于数据验证应该发生在哪里的相互矛盾的哲学,这让我更加困惑。有人说它应该只在数据库中。其他人说,验证规则应该在其他层(如bll或ui)中镜像 数据验证应该在哪里进行?规则是否应该跨多个层拆分?在何时何地验证数据库上运行的应用程序中的数据方面,有哪些实际的最佳实践(与理论相反,是云端类型的东西)。应该这样做: 在第一次输入时 沿途的任何地方都会被改变/操纵 在任何地方,它都可能导致错误或不正确的数据 例如,在数据库驱动的web表单应用程序中,您将进行客户端javascript验证,可能在

我读过关于数据验证应该发生在哪里的相互矛盾的哲学,这让我更加困惑。有人说它应该只在数据库中。其他人说,验证规则应该在其他层(如bll或ui)中镜像

数据验证应该在哪里进行?规则是否应该跨多个层拆分?在何时何地验证数据库上运行的应用程序中的数据方面,有哪些实际的最佳实践(与理论相反,是云端类型的东西)。

应该这样做:

  • 在第一次输入时
  • 沿途的任何地方都会被改变/操纵
  • 在任何地方,它都可能导致错误或不正确的数据
例如,在数据库驱动的web表单应用程序中,您将进行客户端javascript验证,可能在业务逻辑中进行一些服务器端验证,然后在数据库中进行进一步的约束,从数据类型到检查约束。

我的2美分:

数据验证应在两个位置进行:

  • 对数据进行操作的点,例如验证SQL查询的输入参数

  • 在提交数据时进行常规验证,例如在web应用程序中,一些验证应该在客户端进行。优点是,您可以快速通知用户输入问题,即电话号码格式不正确、字符串过长等。但是,这不应被视为权威验证检查,因为在web应用程序的情况下,恶意用户可能会绕过客户端验证

  • 在我看来,数据库不应该执行一般验证,数据应该在进入数据库之前进行验证/转义/清理。也就是说,您的数据库模式可以通过列数据类型、约束等为您提供一个抽象验证级别。也就是说,任何可能引发这些问题的数据都应该在传递到数据库之前“清理”


    也就是说,有很多错误的方法,但没有正确的方法。验证取决于应用程序的体系结构、应用程序中数据的性质以及数据的使用方式。

    验证应该在后端进行,如果可行并有助于您的应用程序,也可以在前端进行验证。但永远不要只依赖前端验证—在将数据插入数据库之前永远不要信任任何数据—始终在数据库级别进行验证(引用完整性、检查约束等)—没有异常。这样,您就永远不会执行抛出错误的数据库查询(将非应用程序错误放在一边,如连接问题)。本质上,您的应用程序执行所有需要进行的验证。这听起来对吗?你永远不能绝对肯定你的DB查询不会因为坏数据而抛出错误,所以你的应用程序应该处理这个问题。然而,你可以做很多事情来防止这种事情发生。一般来说,数据库可以进行基本验证(约束、数据类型等),但在处理验证失败的同时,处理除此之外的任何事情都更为复杂。此外,为什么要用包含未验证数据的查询加载数据库,你的应用程序可以处理这些问题,而且扩展应用程序要比扩展数据库容易得多。你是否复制了每个层中的所有规则?如果没有,您如何决定哪些规则进入哪一层?如果您遵循上述指导原则,这意味着您必须向每个层添加验证,然后向每个层添加验证。这是基于优点,而不是一些可能不适合你的应用程序的规则。+1是商业逻辑作为一个交叉关注点的最佳描述。@Jeff,我想我稍微误解了你的要求。您不必完全复制每个层中的所有规则,只需确保每个层验证到所需的点即可。例如,数据库中的数据类型显式设置了一种验证类型(例如int或string),但由于其性质,这可能只是隐含在另一层中(在其他地方表示为int 9或string“9”可能无关紧要)。