如何使用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
你们如何在数据库中存储表达式和业务规则?
提前致谢。
更新
需要明确的是,规则不是由数据库内部使用,而是由需要持久保存这些标记和规则的外部应用程序创建和使用。感谢。
答案 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)
对于您的示例,需要在二手货之前计算二手货,所有其他商品都可以在没有任何依赖性的情况下计算。
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