作为一个软件工程师,我对在应用层编写业务逻辑有很大成见,而通常依靠数据库比CRUD更小(创建检索更新和删除)操作。 在另一方面,我已经跨越当大量的业务逻辑是写在存储过程中的应用(通常是旧的)运行,所以还有人在那里,喜欢在数据库层编写业务逻辑。
对于拥有和/或存储过程中享受采写/编写业务逻辑的人,是什么/是你的理由使用这种方法吗?
作为一个软件工程师,我对在应用层编写业务逻辑有很大成见,而通常依靠数据库比CRUD更小(创建检索更新和删除)操作。 在另一方面,我已经跨越当大量的业务逻辑是写在存储过程中的应用(通常是旧的)运行,所以还有人在那里,喜欢在数据库层编写业务逻辑。
对于拥有和/或存储过程中享受采写/编写业务逻辑的人,是什么/是你的理由使用这种方法吗?
我试着严重限制在DB我的业务逻辑,只需要做很多的查询和更新执行单个应用程序的操作特效。 也许有人会说,即使是要在应用程序,但我喜欢保持IO下来,如果我能。
数据库是伟大的CRUD,但如果他们得到臃肿与逻辑:
为了尽最大可能,让你的业务逻辑中,这是最可测试和调试的环境。 有在别人的答案,现有的数据库中存储的业务逻辑的一些正当的理由,但他们几乎总是由远胜过此。
限制的业务逻辑应用层是短视的最好的。 经验丰富的专业数据库设计人员很少允许它在自己的系统。 数据库需要有约束和触发器和存储的特效,以帮助确定如何从任何来源的数据将进入它。
如果数据库是保持其完整性,以确保新的数据或数据的改变所有来源遵循的规则,数据库就是把所需的逻辑的地方。 把它应用层数据的噩梦等待发生。 数据库不只是从一个应用程序中获取信息。 在应用程序的业务逻辑往往是无意中通过进口旁路(假设你有一个新的客户谁希望自己的旧的历史数据导入到你的系统或大量的目标记录,没有人会通过界面输入一百万个可能的目标,它会在进口发生。)它也是由(通过查询窗口进行修复一次性问题的变化之类的东西增加10%的所有产品的价格)绕过。 如果你有一个应该被应用到数据改变应用层的逻辑,它不会是。 现在,它的确定把它放在应用层的为好,没有任何意义发送错误的数据到数据库中,浪费网络带宽,但不能把它的数据库迟早会导致数据的问题。
另一个原因让这一切在数据库与用户实施欺诈的可能性来。 如果你把所有的逻辑在应用层,那么您必须授予用户直接访问表。 如果封装所有的逻辑存储的特效,可以将它们仅限于做存储的特效允许,而不是别的。 我不会考虑让各种接入方式,用户对存储的财务记录或个人信息(如健康记录)的数据库,我不会允许任何人,除了一对夫妇的数据库管理员的直接访问任何方式或形式生产记录。 更多欺诈承诺比许多开发商意识到,几乎没有人认为在其设计的可能性。
如果您需要进口大量的数据,要通过数据访问层可以在进口放缓到爬行becasue不采取数据库设计来处理基于集合的操作advanatge。
您的术语“商业逻辑”的使用是相当含糊。
它可以被解释为是指包括对数据(又名“业务规则”)约束的强制执行。 这些执法明确所属的DBMS,期。
它也可以被解释为包括喜欢的东西,“如果一个新的客户到达,然后在一周之内,我们给他发一封欢迎信。” 试图在数据层推这样的东西可能是一个很大的错误。 在这种情况下,“创建一个新的欢迎信”司机可能应该也引发了新的客户排插入应用程序。 想象一下,每一个新的数据库行插入触发一个新的欢迎信,然后我们突然接管另一家公司,我们必须整合该公司的客户在我们自己的数据库......哎哟。
我们在数据库层,在适当情况下做了很多处理。 有很多的操作,你不会想拉回来大型数据集的应用层做分析。 这也是我们的一个更轻松的部署 - 单点式与更新应用程序在所有安装点。 但是,在很大程度上取决于你的应用程序,它的作用; 这里没有一个很好的答案。
一对夫妇ocassions的我已经把“逻辑”在存储过程,因为CRUD可能在多个地方发生。 通过“逻辑”我不得不说,它不是真正的商业逻辑,但更“诚信逻辑”。 这可能是相同的 - 如果事情被删除或以某种方式更新了一些清理工作可能是必要的,并且如果删除或更新可以从不同的代码库多个工具发生它是有道理的,把它在proc他们所有使用。
此外,有时的业务逻辑线“是很模糊的。 举个例子报告 - 他们可以依赖的存储过程或封装什么模式意味着企业“智慧”的观点。 有多少次你看到CASE语句等,其“做事”基于列的值或其他critieria? 可以理解为业务逻辑,但它可能不会在DB在那里可以进行优化等都属于
如果“商业逻辑”是指应用流量,用户控制,定时操作和一般“做企业-的东西”,那么它应该是在应用层我说。 但是,如果它意味着确保无论你如何在数据挖掘身边,它总是有意义,是一个明智的,非自冲突的整体,然后检查执行这些规则在数据库中去,绝对没有问题。 总是有很多方法可以将数据推送到数据库,并操纵它,一旦它的存在。 并非所有的这些方法都内置到他们的商业逻辑“。 您将通过在凌晨3点支持呼叫一个DOS窗口中找到一个SQL会话到DB是什么,它允许例如非常自由! 如果逻辑是不是在DB,以确保所有数据的变化是有意义的,你可以打赌,肯定该数据将表现得非常搞砸了一段时间。 而且,由于系统是唯一的,因为它保存的数据一样有价值,这使得对投资低得多的回报。
有两个很好的理由把业务逻辑在数据库中有:
你经常在数据库层找到商业逻辑,因为它往往可以更快的做出改变和部署。 我觉得往往是最好的意图是不把逻辑存在,但由于易于部署的它结束了那里。
我的金融类型的公司,其中一些规则是由国家应用工作,这些规则和他们的计算受到几乎每天都有,如果没有一定的每周变化。 既然如此,它更有意义移动处理计算数据库的逻辑部件; 其中的变化可以测试和而不必重新编译和redistibute的应用,这是不可能做日常不干扰业务应用。 该存储过程是测试,批准,施加和最终用户是毫无收获。 随着向基于web的应用,所述逻辑移动到数据库的依赖较小,但仍然存在。 即使是Web应用程序(取决于语言)必须编译并发布到这可能导致停机的网站。
有时候,业务逻辑是速度太慢,应用层上运行。 这是在旧系统中的客户端的功率和带宽是比较有限的,尤其如此。
使用数据库做这项工作的主要理由是,你有一个单一的控制点。 通常情况下,应用程序开发人员重复使用或在应用程序的不同部分重写的代码片段。 即使假设这些所有工作完全相同的方式(这是值得怀疑的),当业务逻辑发生变化时,应用程序需要重新审视,重新编码,重新编译。 除非参数发生变化,如该业务逻辑只存储在数据库中,这将是不必要的。
我的选择是保留任何复杂的业务逻辑从数据库中,只是出于维护目的。 如果我得到一个电话在凌晨2点,我宁愿调试我的应用程序代码不是试图步数据库脚本。
主要的原因我把BL在过去存储的特效是,交易均在数据库中更容易。
如果部署是很难为你的应用程序,你不会有一个应用程序服务器,在存储过程中改变BL是部署一个变化的最有效途径。
我想专门为我工作在较旧的应用程序(银行),其中经营业务逻辑是巨大的,它几乎是几乎不可能在应用层执行所有这些业务逻辑,也这是一个很大performenance命中,当我们把这些逻辑在应用层这里取到数据库的数量和网络问题,而忘记ABT performenance较多,导致更多的资源利用率(如果它在Java层的完成更多的Java对象)。
我在团队建设,建立和维护一个相当大的金融体系,我觉得没有办法把逻辑到应用层的,从几十万人的记录会影响或限制获取行动。
除了性能问题,应该错误发生,整顿一个存储过程比调试应用程序,修复,重新编译,较长的停机时间重新部署代码快得多