在哪里为桌面应用程序执行数据验证?在数据库或代码?

luv*_*ere 3 database validation desktop-application

在使用数据库进行存储的单用户桌面应用程序中,是否有必要对数据库执行数据验证,还是可以在代码中执行此操作?什么是最佳实践,如果没有,两种可能性的优缺点是什么?

Jas*_*ams 9

最佳做法是.数据库应负责确保其自身状态有效,并且程序应确保它不会将垃圾传递到数据库.

缺点是你必须编写更多的代码,并且你有额外的运行时开销 - 这两者通常都不是特别好的理由.

优点是数据库确保了低级别的有效性,但是程序可以帮助用户输入有效数据,而不仅仅是从数据库中传回错误 - 它可以提前介入并提供UI提示(例如,将无效文本字段着色为红色)直到他们完成正确,等)

- 编辑(从评论中提升的更多信息) -

在许多情况下,智能方法是在每端编写数据驱动的验证器,并使用共享数据文件(例如XML)来驱动验证.如果验证规范发生更改,则只需编辑描述文件,验证的两端将同步更新.(没有代码更改).

  • PS在许多情况下,智能方法是在每端编写数据驱动的验证器,并使用共享数据文件(例如XML)来驱动验证.如果验证规范发生更改,则只需编辑描述文件,验证的两端将同步更新.(没有代码更改). (3认同)
  • 如果你是程序员,这可能不是最好的主意.代码重复意味着您必须返回前端和后端进行更新/更改. (2认同)
  • 在两个地方应用相同的验证可能会导致错误,但这种风险比不验证输入数据库的数据要危险得多!过分谨慎几乎总是更好.此外,验证通过通常是不同的(DB在较低级别进行验证 - 它只是为了保持其内部状态有效;用户界面寻求应用业务逻辑来提高数据质量.最后,伪劣的编码器将启动它但是,从清晰的规范中仔细工作的程序员不会有任何问题. (2认同)

Mar*_*las 6

你做到了.

数据验证的最佳实践是清理程序对数据库的输入.但是,这并不能成为数据库拥有自己的验证的借口.在代码中编写验证仅考虑托管环境中生成的增量.它不会考虑数据库损坏,管理错误以及数据库将被多个应用程序使用的远程/未来可能性,在这种情况下,应在此新应用程序中复制应用程序级数据验证逻辑.

您的数据库应该有自己的验证例程.您不必将它们视为清理传入数据,就像运行完整性检查/约束/断言一样.数据库中任何时候都不应包含无效数据.这就是完整性约束的全部要点.

总而言之,您同时执行以下两项操作:

  1. 在用户输入到达数据存储之前对其进行清理和验证.
  2. 为您的数据存储配备限制,以加强您的验证.


cor*_*ews 5

在数据到达数据库之前,应始终在代码中进行验证.

  • 一般来说,我更愿意将数据库从中删除.数据库是用于存储数据的存储库,而不仅仅是另一个添加业务逻辑的位置(并且在更改时记住将其保存在两个位置). (4认同)
  • @DOK:"S"DBMS表示系统.它是一个引擎,而不是存储库.使用引擎保护您的数据:如果有人没有使用您的应用或其他应用来更改数据,该怎么办? (3认同)
  • 数据库应始终验证数据.这不是业务逻辑,而是对稳健性和安全性的封装. (2认同)