2009-02-13 18 views
4

如何使用RDBMS存儲邏輯表達式?將條件邏輯表達式/規則存儲在數據庫中

我標記對象,並希望能夠建立基於這些標籤的真相聲明。 (這些可能被視爲虛擬標籤。)

標籤
new
for_sale
used
offer

規則
second_hand_goods = (!new or used) and for_sale
new_offer = new and offer
second_hand_offer = second_hand_goods and offer

  • 規則應該能夠引用標籤和其他規則。
  • 可以很容易通過休眠訪問的模式將是可取的。
  • 最好能夠在一次select/call中檢索整個規則?

你們如何在你的數據庫中存儲表達式和業務規則?

在此先感謝。

更新
需要明確的是,規則不是由數據庫內部使用,但創造和需要堅持這些標記和規則的外部應用程序使用。謝謝。

回答

0

作爲默認值,直到我已經很好地理解了一個問題以找出解決方案,我不會將業務規則存儲在數據庫中。這些屬於代碼。然而,任何規則總是有例外,您可以使用RDBMS的存儲過程和/或函數來封裝這些規則(只要您的數據庫具有這些規則)。但是,正如我所說的,理想情況下,您將以有意義的方式在代碼中解釋數據。

更新

對不起,意識到我沒有回答你的問題。你可以使用函數,如果你的數據庫有它們,允許你傳入參數並返回標量值,或者使用存儲過程。你可能有1個表達式和一個更大的過程來以某種方式組合表達式。

1

管理嵌套/括號可能會變得非常複雜並且容易出錯。我過去的做法是使用XML來定義處理嵌套的邏輯。使用SQL Server 2005或更高版本,您還可以將其很好地存儲在單個表中。

你的二手貨邏輯可以被存儲爲...

<logic type="and"> 
    <logic type="or"> 
     <logic type="not"> 
      <value type="new" /> 
     </logic> 
     <value type="used" /> 
    </logic> 
    <value type="for_sale" /> 
</logic> 

對不起,這不是一個真正的回答你的問題和處事公正的另一種方式。我剛剛發現它在過去爲我工作。

+2

根據我的經驗,我只能說,試圖使用XML作爲編程語言糟透了。 – 2009-02-13 11:35:25

3

從實用的角度來看,如果計算所需的所有列位於同一個表上,則可以對數據庫進行計算字段 - 計算字段只能從單個記錄中運行。大多數現代DBMS平臺都對此功能提供了一些支持。

從理論的角度來看,您正在進入Semantic Data Modelling。關於此的最佳論文是Hammer和MacLeods Ruritanian Oil Tankers論文,該論文描述了一種語義數據建模符號,其中被稱爲SDM。 SDM使用結構化的英語類型符號來標記所描述類別的數據庫規則。如果您想概括您的功能,並且不介意爲SDM編寫解析器,則可以創建一個規則引擎,以便可以配置這類邏輯。這種類型的模型也應該可以適應與O/R映射器很好地發揮作用。

從負面來看,製作這種工具將非常耗時,所以如果您對管理數據語義的需求非常大,那麼這將是值得的。舉例來說,你可以很容易地將它應用到矯枉過正的領域,但是如果你的問題更大,那麼建立這樣的東西可能是值得的。如果您不想編寫解析器,則可以創建一個XML架構來標記類似SDM的語言。

0

怎麼是這樣的:

Tables: 
tags(id, name) 
goods (id, ...) 
goods_tags_mm (tag_id, good_id) 
rules (id, name) 
rules_cnf (id, rule_id) 
rules_cnf_terms (rules_cnf_id, tag_id) 
0

我會用一個表

tags(id,name,type,expression,order) 
  • 如果標籤是正常的或計算將顯示。如果添加新的計算標籤
  • 爲了被重新排序,它規定了計算這些標籤的順序...
  • 表達被解析並插入行前檢查,它也可以使用內置GUI(類似於Oracle發現者如何做這些事情)。
  • 你只的普通標籤鏈接到項目

對於示例需要計算前二手要約,全部的人都沒有任何依賴關係來計算的二手貨。

1,'new',1,'',NULL 
2,'for_sale',1,'',NULL 
3,'used',1,'',NULL 
4,'offer',1,'',NULL 
5,'second_hand_goods',2,'(!new or used) and for_sale',1 
6,'new_offer',2,'new and offer',1 
7,'second_hand_offer',2,'second_hand_goods and offer',2 

的項目可能只供銷售進行標記,計算會給:

second_hand_goods,second_hand_offer 

我想有一個功能,讓該項目的所有標籤的列表,包括直接標記和計算的人:

for_sale,second_hand_goods,second_hand_offer