一直以来都存在这样的问题:应该将业务逻辑放在数据库中,作为存储过程(或程序包),还是放在应用程序/中间层中?更重要的是,为什么?
假设数据库独立性不是目标。
一直以来都存在这样的问题:应该将业务逻辑放在数据库中,作为存储过程(或程序包),还是放在应用程序/中间层中?更重要的是,为什么?
假设数据库独立性不是目标。
在确定业务逻辑应该放到哪里时,代码的可维护性总是一个大问题。
集成的调试工具和更强大的IDE通常使得中间层代码比存储过程中的同样代码更易于维护。除非真有必要,否则您应该从中间层/应用程序开始编写业务逻辑,而不是存储过程。
然而,当涉及报告、数据挖掘/搜索时,存储过程往往是更好的选择。这要归功于数据库聚合/过滤能力的强大以及处理非常接近数据源的事实。但是这可能并不是大多数人所考虑的传统业务逻辑。
将足够的业务逻辑放入数据库中,以确保数据的一致性和正确性。
但不要担心需要在其他层面上复制一些这些逻辑来增强用户体验。
对于非常简单的情况,您可以将业务逻辑放在存储过程中。通常即使是简单的情况随着时间的推移也会变得复杂。以下是我不将业务逻辑放在数据库中的原因:
将业务逻辑放在数据库中会紧密地耦合它与数据库的技术实现。更改表格将导致您再次更改许多存储过程,并引起许多额外的错误和测试。
通常 UI 对于验证等事项依赖于业务逻辑。将这些内容放在数据库中将导致数据库和 UI 之间的紧密耦合,或者在不同情况下在这两个方面之间重复验证逻辑。
在同一数据库上运行多个应用程序将变得困难。为一个应用程序进行的更改将导致其他应用程序出现问题。这很快就会变成维护噩梦。因此它并不能真正扩展。
更实际的是,SQL 不是用于以可理解的方式实现业务逻辑的好语言。 SQL 对于基于集合的操作非常好,但是它缺少“大规模编程”结构,很难维护大量的存储过程。现代面向对象语言更适合这种情况,并且更加灵活。
这并不意味着您不能使用存储过程和视图。我认为有时在表格和应用程序之间放置额外的存储过程和视图层是一个好主意,以将它们解耦。这样,您就可以在不更改外部接口的情况下更改数据库布局,从而使您能够独立地重构数据库。
只要你保持一致,真的取决于你。
把它放在数据库层面是一个好理由:如果你相当确定你的客户永远不会更改他们的数据库后端。
把它放在应用程序层面是一个好理由:如果你正在为你的应用程序针对多个持久化技术。
你还应该考虑核心能力。你的开发人员主要是应用程序层面的开发人员,还是主要是DBA类型的开发人员?
任何影响数据完整性的事情都必须放在数据库层面上。除了用户界面之外,其他东西经常将数据导入、更新或从数据库中删除,包括导入、批量更新以更改定价方案、热修复等。如果您需要确保规则始终得到遵守,请将逻辑放在默认值和触发器中。
这并不是说,在用户界面中也没有这个好主意(为什么要发送数据库不接受的信息),但忽略这些数据库中的事情就是在冒着灾难的风险。
虽然在应用层上有业务逻辑的好处,但我想指出的是,与数据库相比,编程语言和框架似乎更加经常更换。
我支持的一些系统在过去10-15年中经历了以下UI界面:Oracle Forms/Visual Basic/Perl CGI/ASP/Java Servlet。唯一没有改变的是关系型数据库和存储过程。