将逻辑表达式存储到 RDBMS 中的结构

Far*_*had 2 php mysql sql rdbms logical-operators

考虑以下变量是由玩家分析器服务生成的:

    level = 6;
    errors = 4;
    score = 12;
    ...
Run Code Online (Sandbox Code Playgroud)

我们有一些规则和信息:

 1. errors == 0 AND level > 5 : Senior player
 2. score == 10 OR errors == 3: Border line player
 3. score > 10 AND score < 13: Not good, just passed
 4. ...
Run Code Online (Sandbox Code Playgroud)

现在我们应该打印正确的消息。

另一个例子:考虑以下变量是由食品分析仪服务生成的:

    fruit = 2;
    coca = 6;
    ...
Run Code Online (Sandbox Code Playgroud)

我们有一些规则和信息:

 1. fruit == 0 : Consider buying some fruits
 2. coca == 0: That's healthy
 3. ...
Run Code Online (Sandbox Code Playgroud)

现在我们应该打印正确的消息。

我应该如何在 MySQL 等 RDBMS 中保存规则和消息,以便轻松查询和查找消息。

最糟糕的方法是将规则保存在一列中,将消息保存在另一列中,然后加载每条记录以用主机编程语言进行测试。

在此输入图像描述 在此输入图像描述

对于这种情况你能建议一个更好的方法吗?当我们有几千条消息时,这不是一个好方法,我们需要一种在数据库端过滤消息的方法。

bbr*_*umm 5

我创建了一个快速 ERD 来演示我最初是如何设计它的: 在此输入图像描述

所有这些列和表是什么意思?

属性名称

它包含可以检查其值的所有内容的列表。

  • property_id - 主键
  • property_name - 已存储值的项目的文本值。例如“错误”、“级别”、“水果”。

操作员

包含用于每个属性的不同运算符的列表。

  • Operator_id - 主键。
  • operator_symbol - 检查值时使用的符号。我不确定实际的符号是否是存储在这里的最佳值,但它可以工作。示例为“==”、“">”、“">=”。

规则消息

存储正在显示的实际消息。

  • rule_message_id - 主键
  • message - 要显示的消息文本。例如“高级玩家”、“考虑购买水果”。

操作符属性

这是所有其他三个表之间的连接表,包含您的规则和逻辑。

  • property_operator_id - 主键。它被称为代理键 - 如果您愿意,您可以排除此列,并将 PK 设置为 (property_id、operator_id、rule_message_id)(如果您愿意)。
  • property_id - 正在使用的 property_name 记录(例如“错误”的 ID)
  • operator_id - 正在使用的操作员记录(例如“==”的 ID)
  • rule_message_id - 正在使用的rule_message(例如“高级玩家”的ID)
  • check_value - 正在针对运算符的属性进行检查的值。例如 6、4、12。

如何使用此设计: * 您可以将所有属性和运算符添加到表中。* 查找要为某个场景显示的消息,例如检查要向玩家显示的内容:

SELECT rn.rule_message_id, rm.message
FROM rule_message rm
INNER JOIN operator_property op ON rm.rule_message_id = op.rule_message_id
INNER JOIN property_Name pn ON op.property_id = pn.property_id
INNER JOIN operator o ON op.operator_id = o.operator_id
WHERE 1=1
AND (
    pn.property_name = "errors"
    AND pn.operator_symbol = "=="
    AND op.check_value = 0
)
AND (
    pn.property_name = "level"
    AND pn.operator_symbol = "5"
    AND op.check_value = 5
)
Run Code Online (Sandbox Code Playgroud)

理想情况下,该查询将返回 1 行。如果返回 0,则没有消息适用。如果它返回 2 或更多,则意味着它不完全符合您的条件之一,因此没有任何消息适用。

希望这可以帮助!我之前写过关于设计数据库的文章,我能给您的最好建议是弄清楚数据的用途,您似乎已经知道了。

另外,如果您能为表想出更好的名称,那就去吧 - 这只是一个快速设计来说明这一点。