是应该在应用程序层和数据库层中实施业务规则,还是只在其中一个中实施?

aw *_*rud 7 database stored-procedures business-rules n-tier-architecture

我一直在我的应用程序层(模型)和我的数据库层(引发错误的存储过程)中实施业务规则.

由于以下几个原因,我一直在复制我在两个地方的验证:

  1. 如果有条件,当他们在应用程序代码进行检查,当他们在数据库中检查之间切换,在数据库中的业务规则检查将保存一天.数据库还允许我以比我的应用程序代码更简单的方式锁定各种记录,所以在这里这样做似乎很自然.
  2. 如果我们直接做一些批量数据的插入/更新到数据库中,如果我将所有这些操作通过我的存储过程/函数其正在做的业务规则验证,也没有投入坏数据,即使我没有在我的机会如果我通过应用程序进行单输入,我会得到保护.
  3. 而只有在数据库中执行这些东西会对实际数据相同的效果,似乎不当首先做一个很好的努力,以验证它是否符合约束和业务规则之前,在数据库中,就把数据.

什么是正确的平衡?

Wil*_*ung 6

您需要在数据层强制执行以确保数据完整性.这是你的最后一道防线,也就是数据库的工作,以帮助强制执行其数据的世界观.

也就是说,将垃圾数据扔到数据库进行验证是一种粗略的技术.通常,错误被设计为人类可读而不是机器可读,因此程序处理来自DB的错误并使其从头到尾都是低效的.

存储过程是另一回事.在当天,存储过程是处理数据层等业务规则的方法.

但是今天,在现代应用程序服务器环境中,它们已成为一种更好的放置这种逻辑的地方.它们提供了多种访问和公开数据的方式(Web,Web服务,远程协议,API等).此外,如果您的规则是CPU重(可能大多数不是),那么扩展应用服务器比数据库服务器更容易.

应用程序服务器中的大量功能为他们提供了超出数据库服务器所能做的灵活性,因此,一旦被推回到数据库中的大部分功能都被淘汰,数据库服务器被降级为"愚蠢的持久性".

也就是说,使用存储过程等确实存在性能优势,但现在这是一个调整问题,"问题变成"是否值得失去应用服务器功能以获得通过将其放入数据库服务器获得的收益".

通过app服务器,我不只是简单地谈论Java,而是.NET甚至PHP等.