在数据库中存储条件逻辑表达式/规则

时间:2009-02-13 11:21:25

标签: database hibernate rdbms

如何使用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

  • 规则应该能够引用标签和其他规则。
  • 可以通过hibernate轻松访问的模式是首选。
  • 最好能在一次选择/通话中检索整个规则吗?

你们如何在数据库中存储表达式和业务规则?

提前致谢。

更新
需要明确的是,规则不是由数据库内部使用,而是由需要持久保存这些标记和规则的外部应用程序创建和使用。感谢。

5 个答案:

答案 0 :(得分:3)

从实用的角度来看,如果计算所需的所有列都存在于同一个表中,则可以在数据库上创建计算字段 - 计算字段只能在单个记录中工作。大多数现代DBMS平台都对此功能有一些支持。

从理论的角度来看,你正在进入Semantic Data Modelling。关于此的最好的论文是Hammer和MacLeods Ruritanian Oil Tankers论文,它描述了一种富有想象力的称为SDM的语义数据建模符号。 SDM使用结构化英语类型表示法来标记您描述的排序的数据库规则。如果您想要概括您的功能并且不介意为SDM编写解析器,您可以创建一个可以配置此类逻辑的规则引擎。这种类型的模型也应该可以适应与O / R映射器的良好匹配。

从消极方面来说,制作这种工具非常耗时,因此只有在管理数据语义的要求非常大的情况下才值得做。对于这个例子,你引用它会很容易适应过度杀伤的范围,但如果你的问题更大,那么建立这样的东西可能是值得的。如果您不想编写解析器,可以创建一个XML模式来标记类似SDM的语言。

答案 1 :(得分:2)

管理嵌套/括号可能会变得非常复杂并且容易出错。我过去这样做的方式是使用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 :(得分:0)

默认情况下,在我完全理解问题并找出解决方案之前,我不会将业务规则存储在数据库中。这些属于代码。但是,任何规则都有例外,您可以使用RDBMS的存储过程和/或函数来封装这些规则(假设您的数据库具有这些规则)。但是,正如我所说,理想情况下,您将在代码中以有意义的方式解释数据。

更新

抱歉,意识到我没有回答你的问题。您可以使用函数(如果您的数据库具有它们),允许您传入参数并返回标量值,或使用存储过程。你可能有1个表达式和一个更大的过程来以某种方式组合表达式。

答案 3 :(得分: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 )

答案 4 :(得分: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

一个项目只能被for_sale标记,计算会给出:

second_hand_goods,second_hand_offer

我会有一个函数,它给出了项目所有标签的列表,包括直接标签和计算标签:

for_sale,second_hand_goods,second_hand_offer