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

chi*_*tom 6 database rdbms hibernate

如何使用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轻松访问的模式是首选的.
  • 优选地,可以在一个选择/呼叫中检索整个规则?

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

提前致谢.

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

Con*_*lls 6

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

从理论的角度来看,您正在进入语义数据建模。这方面最好的论文是 Hammer 和 MacLeodsRuritanian Oil Tankers论文,它描述了一种被想象性地称为 SDM 的语义数据建模符号。SDM 使用结构化的英语类型符号来标记您描述的那种类型的数据库规则。如果您想概括您的能力并且不介意为 SDM 编写解析器,您可以制作一个可以配置此类逻辑的规则引擎。这种类型的模型也应该可以很好地适应 O/R 映射器。

不利的一面是,制作这种工具会非常耗时,因此只有当您对管理数据语义的需求非常大时才值得这样做。对于您引用的示例,它可以轻松地适应矫枉过正的领域,但如果您的问题要大得多,则可能值得构建这样的东西。如果您不想编写解析器,您可以创建一个 XML 模式来标记类似 SDM 的语言。


Rob*_*Day 5

管理嵌套/括号会变得非常复杂并且容易出错。我过去这样做的方法是使用 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>
Run Code Online (Sandbox Code Playgroud)

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

  • 根据我的经验,我只能说尝试使用 XML 作为编程语言很费时间。 (4认同)

Phi*_*ett 1

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

更新

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