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 中保存规则和消息,以便轻松查询和查找消息。
最糟糕的方法是将规则保存在一列中,将消息保存在另一列中,然后加载每条记录以用主机编程语言进行测试。
对于这种情况你能建议一个更好的方法吗?当我们有几千条消息时,这不是一个好方法,我们需要一种在数据库端过滤消息的方法。
所有这些列和表是什么意思?
属性名称
它包含可以检查其值的所有内容的列表。
操作员
包含用于每个属性的不同运算符的列表。
规则消息
存储正在显示的实际消息。
操作符属性
这是所有其他三个表之间的连接表,包含您的规则和逻辑。
如何使用此设计: * 您可以将所有属性和运算符添加到表中。* 查找要为某个场景显示的消息,例如检查要向玩家显示的内容:
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 或更多,则意味着它不完全符合您的条件之一,因此没有任何消息适用。
希望这可以帮助!我之前写过关于设计数据库的文章,我能给您的最好建议是弄清楚数据的用途,您似乎已经知道了。
另外,如果您能为表想出更好的名称,那就去吧 - 这只是一个快速设计来说明这一点。