我面臨以下問題,我需要設計一個帶有嵌套條件邏輯的過濾器引擎。數據庫設計來存儲函數的值和參數
我將邏輯表示爲每個分支第一個值爲「或」或「與」的樹;所述第二值可以是
- 函數
- 進一步條件結構
另一分支。例如一個名稱:
$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