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
  • 關鍵

請注意,關係(子項)和參數數據不在節點表中,而是由您在檢索節點時必須加入的交叉引用表指定。我期望它是「子」表,它將成爲你遞歸樹中的中心參與者,而「節點」和「參數」將成爲連接表。

請讓我們知道您最終成功使用的解決方案。