我有一个条件表,它定义了一些条件。 我有另一个名为规则的表,它定义了一些规则,每个规则可以有很多条件。但是,规则必须能够以这种方式对条件进行分组:
(condition1) &&
(condition2) &&
(condition3
|| condition4
||
(condition6 &&
condition7)
) &&
(condition5)
由于这种嵌套可以达到想要的深度,所以我无法使用绑定(bind)表绑定(bind)这两个表,所以我正在考虑将其实际保存到规则表中,如下所示: (条件1)&&(条件2)&&(条件3||条件4||(条件6&&条件7))&&(条件5) 其中“condition1”是条件 1 的 ID,依此类推。
然后我会在 PHP 中解析此信息,并以某种方式从整个字符串创建逻辑检查。
这是一个好的方法,还是有更好的方法在 MySQL 中进行这种嵌套绑定(bind)?我绝对需要保持在单个规则上对 AND 和 OR 子组中的条件进行分组的能力。
最佳答案
我当然会避免将您的条件存储为字符串。您必须解析该字符串才能使用它,如果您想编辑预先存在的条件(或搜索某些条件等),您可能最终会陷入困境。
尽管 @tpaksu 的解决方案有一些缺陷,但我肯定会将其存储在某种形式的树结构中。我会提出一些类似的建议
ID | Rule_ID | Condition_ID | Parent | Operator |
------------------------------------------------------------
1 | 1 | NULL | NULL | AND |
2 | 1 | 1 | 1 | NULL |
3 | 1 | 2 | 1 | NULL |
4 | 1 | NULL | 1 | OR |
5 | 1 | 3 | 4 | NULL |
6 | 1 | 4 | 4 | NULL |
7 | 1 | NULL | 4 | AND |
8 | 1 | 6 | 7 | NULL |
9 | 1 | 7 | 7 | NULL |
10 | 1 | 5 | 4 | NULL |
我认为这代表了您想要建模的原始逻辑结构。这样做的优点是您的树中可以有多个分支,其中条件处于同一级别,并且您可以跟踪每个条件属于哪个分支 - 您不必依赖表中条目的顺序。父列指的是表的主 ID 列。
您基本上有两种类型的行(这表明您可以将其拆分为两个表):
- 带有运算符的行是一个“节点”,它使用两个逻辑运算符之一组合一个或多个条件/节点(但我想您可以使用任何逻辑运算符)。这些节点没有condition_id
- 带有condition_id的行代表一个条件(我已根据您的示例对它们进行了编号)。这些行没有运算符,因为单个操作数上不能有运算符。我没有考虑您的基本条件本身是否使用与您在问题中抽象细节相同的逻辑运算符。
我不确定您是否也需要rule_id。在此示例中,您不需要,但如果您想存储有关每个规则的元信息(例如名称/标签、有效日期范围等),您可能需要将其提取到单独的表中。它还可能使在 PHP 中重建逻辑变得更容易,因为 MySQL 不容易处理递归查询 AFAIAA。
关于php - MySQL 和 PHP - 链接实体的逻辑条件分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783533/