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

Database 在数据库中存储条件逻辑表达式/规则,database,hibernate,rdbms,Database,Hibernate,Rdbms,如何使用RDBMS存储逻辑表达式 我标记对象,并希望能够基于这些标记构建真理陈述。(这些可能被视为虚拟标记。) 标签 新建 出售 已使用 优惠 规则 二手货=(!新的或旧的)和待售的 new\u offer=new and offer 二手货报价=二手货和报价 规则应该能够引用标记和其他规则 hibernate可以轻松访问的模式更可取 最好可以在一次选择/调用中检索整个规则 你们如何在数据库中存储表达式和业务规则 提前谢谢 更新 需要明确的是,这些规则不是供数据库内部使用的,而是由需要持久化

如何使用RDBMS存储逻辑表达式

我标记对象,并希望能够基于这些标记构建真理陈述。(这些可能被视为虚拟标记。)

标签
新建

出售

已使用

优惠

规则
二手货=(!新的或旧的)和待售的

new\u offer=new and offer

二手货报价=二手货和报价

  • 规则应该能够引用标记和其他规则
  • hibernate可以轻松访问的模式更可取
  • 最好可以在一次选择/调用中检索整个规则
你们如何在数据库中存储表达式和业务规则

提前谢谢

更新

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

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

更新


对不起,意识到我没有回答你的问题。如果数据库中有函数,您可以使用这些函数传递参数并返回标量值,或者使用存储过程。每个表达式可能有1个,并有一个更大的过程以某种方式组合表达式。

管理嵌套/括号可能会变得非常复杂,并且容易出错。我过去这样做的方式是使用XML定义逻辑,因为它可以很好地处理嵌套。使用SQLServer2005或更高版本,您还可以将其很好地存储在单个表中

您的二手货逻辑可以存储为

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


很抱歉,这不是对你问题的实际回答,只是一种另类的做事方式。我刚刚发现它在过去对我有用。

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

从理论的角度来看,你正在陷入困境。关于这方面最好的论文是Hammer和MacLeods论文,该论文描述了一种语义数据建模符号,富有想象力地称为SDM。SDM使用结构化的英文类型表示法来标记您描述的数据库规则。如果您想推广您的功能,并且不介意为SDM编写解析器,那么您可以创建一个规则引擎,在这里可以配置这种逻辑。这种类型的模型也应该能够很好地适应O/R映射器


另一方面,制作这种工具会非常耗时,因此只有在您对管理数据语义的需求非常大的情况下才值得这么做。例如,你所举的例子,它可以很好地适应过度杀伤力的领域,但如果你的问题更大,那么它可能值得建立这样的东西。如果您不想编写解析器,可以创建一个XML模式来标记类似SDM的语言。

这样的东西怎么样:

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 )
我要一张桌子

tags(id,name,type,expression,order)
  • type将显示标记是正常的还是计算的
  • 顺序重新排序如果添加新的计算标记,它将指定这些标记的计算顺序
  • 表达式在插入行之前进行分析和检查,它也可以使用GUI构建(类似于Oracle Discoveryr如何执行这些操作)
  • 仅将普通标记链接到项目
对于您的示例,二手商品需要在二手报价之前进行计算,所有其他商品都可以在没有任何依赖关系的情况下进行计算

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

根据我的经验,我只能说,尝试使用XML作为编程语言非常耗时。但是,我完全同意,这纯粹是为了存储基于逻辑的公式。主要的一点是,我宁愿使用XML现成的嵌套功能,而不是将此机制构建到数据库中。嘿,我也有类似的情况,我正在考虑使用这样的设计…(SqlXml字段)更重要的是,整个表达式只是为了我的系统中的一个非常微不足道的功能,只是想问一下这是否是“ok”的设计术语?因为像上面这些家伙一样,很多人都有一些复杂的方法来存储它,而不使用xml,在数据库中@anton@RobinDay那看起来像是我要找的东西。谢谢你能告诉我如何将这个XML解析成PHP表达式吗?@DenisO。我知道这已经晚了几年,但我有一些PHP处理类似的东西——它实现了and,或者,至少,最多,和sum的方法