如何将业务逻辑存储到数据库中?

时间:2016-12-26 15:10:40

标签: ruby-on-rails database database-design business-logic

我想允许用户定义简单业务逻辑,例如:

if (x and y) then ...
if (z or w) then ...

让我具体说明一下:

我正在开发一个人力资源模块,可以解答申请人是否满足某些要求,并由用户定义。

可以围绕逻辑运算符定义这些要求:

  

(必须年满18岁)(未满18岁必须获得家长许可)

将这种逻辑放入数据库中吗?我认为是这样,但我害怕花时间在这上面,并发现这是一种糟糕的做法。

4 个答案:

答案 0 :(得分:1)

通常,答案是"它取决于" ;)由于这种情况下的逻辑似乎是用户定义的数据,因此将其放入数据库是绝对合理的。

但是,如果您希望将此输入的结构/ AST建模为单独的业务对象,并将其andor控制流反映在数据库记录中,我将不得不说它&# 39;很可能是过度杀戮,并且除了最初的实施开销之外,还会使未来的重构变得非常困难。

将在运行时评估的简单文本字段是最简单的方法,因为它的内容可以非常容易地提取和推理。

不知道您的明确要求,我建议您查看Drools,这是Java的规则引擎,在其生态系统中也有规则存储后端和指导编辑器。顺便提一下,你的问题中的例子看起来很像它可能从规则引擎中受益,但不幸的是我没有任何相关Ruby库的实际经验。

否则,thougtbot博客上的这篇文章 - Writing a Domain Specific Language in Ruby - 在这种情况下也可能会有所帮助。

答案 1 :(得分:1)

没关系。这是一种灵活的方法,虽然在开发过程中耗费时间。

此外,您不必创建自己的DSL,它已经完成,例如json-logic-ruby允许在json中保留复杂的规则。

答案 2 :(得分:0)

我绝对认为没关系。因为用户正在定义业务逻辑或规则,所以我建议将业务逻辑表单字段拆分为多个部分(规则:if / unless,operand1:user.age,operand2:permissions.parental operator1:and,operator2:greater_than ...)然后将每个业务逻辑对象作为一行存储在序列化的JSON列中。与用户输入他们喜欢的任何内容的单个文本字段相比,这应该使它们更容易验证并且更不容易出错。

答案 3 :(得分:0)

我建议创建一个简单的表来存储逻辑,如果它是可预测的。

例如:

read.csv(text=sub("\\s+", ",", crime$Date.Rept), header=FALSE, 
           col.names = c("Date", "Time"), stringsAsFactors=FALSE)
#       Date     Time
#1 12/1/2016         
#2 12/1/2013 12:07 AM
#3 12/1/2016  7:76 AM
#4 12/1/2016 11:54 AM
#5 12/2/2016  1:34 PM

所以当你在某一天有更多Table: business_logics Attributes: opt_1: decimal opt_2: decimal logic_opt: integer (enum: and|or) then_statement: string 时,这是可扩展的,顺便说一句,你可以在验证中获得优势。稍后重构!允许用户输入自由文本在您的情况下风险很大!