我面临以下问题,我需要设计一个带有嵌套条件逻辑的过滤器引擎。数据库设计来存储函数的值和参数
我将逻辑表示为每个分支第一个值为“或”或“与”的树;所述第二值可以是
- 函数
- 进一步条件结构
另一分支。例如一个名称:
$tree = [
'nodetype' => 'ruleset',
'conditional' => 'OR',
'children' => [
[
'nodetype' => 'method',
'methodName' => 'startsWith'
'arguments' => [
'startsWithThis' => 'john',
'subject' => 'john doe'
]
],
[
'nodetype' => 'ruleset'
'conditional' => 'AND',
'children' => [
...more nesting
]
]
]
];
此树然后递归使用的Symfony的评价表达式语言组件(我为startsWith
等方法注册了自定义表达式)。
问题是方法在它们接受的参数数量和参数顺序上会有所不同。我不知道如何将它存储在关系数据库中,而不需要将整个树序列化为json字符串;这是我想避免的。
我想出迄今已是以下数据库结构:
过滤器:
- ID
- 名
filter_arguments:
- ID 个
- 过滤器_id
- 名
filter_usecases:
- ID
- 过滤器_id
filter_usecase_values
- ID
- filter_usecase_id
- filter_argument_id
- 值
但是这个表的设计并没有解决存储的一个分支 “或”/ “和” 性质的问题;也不能表示嵌套的过滤器(例如分支的父子关系)。
我该如何解决这个问题?是否有一个特定的术语来描述我想要在这里实现的目标?我很乐意阅读更多关于这方面的信息,但我甚至不知道该怎么去google。
您可能会发现有关分层数据的[本文](http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)。 – geoB