我有一个包含存款表(保证金,宠物存款等)的数据库,在某些情况下,这些存款需要减少,即有人购买补充保险。我是否应该有一个名为say,alter_deposits的表,它将包含减少的条件以及数量,或者这是应用程序代码中属于业务逻辑的东西吗?
提前致谢!
答案 0 :(得分:3)
在这种情况下,我喜欢尝试将规则概括为尽可能基本的规则。所以你可能有一个减少x%的减少规则。然后你可能有一个基于条件的规则,所以你可以说当余额大于y时取消x%。
在对规则进行概括之后,我将以通用形式在业务逻辑中实现规则,并且在数据库中,您可以存储当前活动的规则类型及其输入。
您可以在不安排停机时间的情况下执行此操作,放入新规则,应该像更新数据库一样简单,如果有新的规则类型,您可以部署新的代码段。当然这取决于你的环境,我知道.net这应该是直截了当的。
我开发了一个非常有趣的基于规则的处理系统,我们基本上构建了一个And& amp;的二叉树。或操作符将返回true或false的操作数,如果树返回true,我们执行操作。这全部序列化为Xml,这使得存储机制与规则类型及其数据要求无关。
修改强>
基于规则的系统可以非常强大。我已经用它们来帮助定位分散在数千个不同库存中的小部件,并根据任意数量的标准对购买小部件的最佳位置进行排名。我已经看到他们曾经在零件上征服,例如在汽车领域,OEM喜欢在AM零件上竞争但仅在某些情况下。
您可能已经定义了规则的超集,并且当项目向下传递时,您可能会找到其他规则。规则可以包含表达式和动作。表达式可以表示为一个子条件树,当它的行为运行时,它会评估为真或假。
如果您使用.net,您实际上可以使用表达式树构建一个相当动态的系统,并动态创建可以表示操作数和操作的lamba。
有预制规则引擎可以帮助快速启动,但我从来没有找到足够便宜或基本足以满足我的需求。
在我看来,这个概念的扩展是工作流程编程。因此,当存款进入时,假设在您的规则运行后,存款结果为> 25%。在这种情况下,您需要员工批准此案例。工作流引擎可以封装这种类型的逻辑,并以比传统编码更流畅的方式表达它。但是所有事情都有很多缺点。每当我开始使用工作流引擎的路径时,由于各种原因,它最终会被彻底毁掉,但通常是因为我们的工作流程太简单而无法证明学习引擎的成本。
答案 1 :(得分:2)
对我而言,对于这类问题的经验法则是,您是否希望在不关闭网站的情况下在运行时更改它。
如果您希望更新业务规则而不安排停机时间,那么您可能希望将其放入数据库中,否则将其放在代码中,您必须安排停机时间并在更新网站之前通知您的用户代码。
答案 2 :(得分:1)
您需要确定的是这些条件可能会发生变化的可能性。将它们放在数据库中并围绕它们包装UI将使它们更容易更改,尤其是如果有一些管理员类型的用户不是维护程序员。
答案 3 :(得分:0)
如果可以推广减少规则,那么将其作为业务逻辑添加到应用程序代码最有意义。 如果减少是个人的一次性付款,那么设置另一个表来捕获和存储它们可能是最好的答案。
答案 4 :(得分:0)
您应该将此视为“事务”事务在SQL中是强大的(并且最近只在MySQL中正确实现),即使您可能正在递增或递减Transaction方法,您也可以将货币单位返回到失败前的实体来了。
无论我是否会管理模型中的所有业务逻辑(假设您遵循MVC约定)。您不应该在数据库中拥有仅用于管理其他列的列,除非它是外键。考虑事务(我相信事务是资源)表,具有transaction_type和value。