0

我面临以下问题,我需要设计一个带有嵌套条件逻辑的过滤器引擎。数据库设计来存储函数的值和参数

我将逻辑表示为每个分支第一个值为“或”或“与”的树;所述第二值可以是

  • 函数
  • 进一步条件结构

另一分支。例如一个名称:

$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。

+1

您可能会发现有关分层数据的[本文](http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)。 – geoB

回答

1

要快速地刺它,只是从数据去:

节点

  • ID
  • NODETYPE
  • 条件
  • METHOD_NAME

孩子

  • ID
  • parent_node_id
  • child_node_id

参数

  • ID
  • NODE_ID
  • 关键

请注意,关系(子项)和参数数据不在节点表中,而是由您在检索节点时必须加入的交叉引用表指定。我期望它是“子”表,它将成为你递归树中的中心参与者,而“节点”和“参数”将成为连接表。

请让我们知道您最终成功使用的解决方案。