2016-12-26 75 views
0

我想允許用戶定義簡單業務邏輯,如:如何將業務邏輯存儲到數據庫中?

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

讓我把它具體:

我開發,如果申請人滿足一定的要求,回答一個HR模塊,由用戶定義。

這些要求可以圍繞邏輯運算符來定義:

(必須是18歲)(18歲必須有家長許可)

是把這個數據庫裏面的邏輯好嗎?我認爲是這樣,但我害怕花時間在這件事上,並發現它是一種糟糕的做法。

回答

1

經常這樣,答案是「它依賴於」;)由於在這種情況下,邏輯似乎是用戶定義的數據,因此將其放入數據庫是絕對合理的。

但是,如果你正在尋找此輸入的結構/ AST與他們andor控制流模型爲單獨的業務對象反映數據庫中的記錄,我不得不說,這很可能矯枉過正和意志 - 除了最初的實現開銷 - 使未來的重構非常困難。

將在運行時評估的簡單文本字段是最簡單的方法,因爲其內容可以很容易地提取和推理。

不知道你的權威要求,我建議你看看Drools,一個Java的規則引擎,它的生態系統中還有一個規則存儲後端和指導編輯器。順便提一下,你的問題中的例子看起來很像它可能受益於規則引擎,但不幸的是,我沒有任何相關Ruby庫的實際經驗。

否則這篇關於thougtbot博客的文章 - Writing a Domain Specific Language in Ruby - 也可能對此有幫助。

0

我絕對認爲沒關係。由於用戶正在定義業務邏輯或規則,因此我建議將業務邏輯表單字段拆分爲多個部分(規則:if/unless,操作數1:user.age,操作數2:權限。父級操作員1:和操作員2:更高級_ .. ),然後將每個業務邏輯對象作爲行存儲在序列化的JSON列中。與用戶輸入任何他們喜歡的單個文本字段相比,這應該使他們更容易驗證並且更不容易出錯。

0

我會建議創建一個簡單的表來存儲邏輯,如果它是可預測的。

例如:

Table: business_logics 
Attributes: 
opt_1: decimal 
opt_2: decimal 
logic_opt: integer (enum: and|or) 
then_statement: string 

所以這是可擴展的,當你有一天在更logic_opt,順便說一句,你可以得到的好處的驗證&重構以後!允許用戶輸入自由文本在您的案例中風險很大!

0

沒關係。這是一種靈活的方法,雖然在開發過程中很耗時。此外,您不必創建自己的DSL,它已經完成,例如, json-logic-ruby允許在json中保留複雜的規則。

相關問題