0

入れ子の条件付きロジックを持つフィルタエンジンを設計する必要がある次の問題に直面しています。関数の値と引数を格納するデータベースの設計

私は、各分岐の最初の値が "OR"または "AND"であるツリーとして論理を表しています。第2の値は、例えば、さらに、条件付き構造

  • 機能
  • の名前別のブランチのいずれかであり得る:

    $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
    • filter_id

    filter_usecases:

    • ID
    • filter_id

    filter_usecase_values

    • ID
    • をfilter_usecase_id
    • filter_argument_id

    しかし、この表のデザインは枝の "OR"/"と" 自然を保存する問題に対処しない値。ネストされたフィルタ(例えば、ブランチの親子関係)を表すこともできない。

    どうすればよいですか?私がここで達成しようとしていることを記述する特定の用語がありますか?私はこのことについてもっと喜んで読んでいますが、私はGoogleに何を知るかさえしません。データだけ行くから、それを簡単に刺しを取ること

+1

階層データに関する[この記事(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)]が役立つ場合があります。 – geoB

答えて

1

ノード

  • ID
  • NODETYPE
  • 条件
  • METHOD_NAME

子供を

  • ID
  • parent_node_id

引数

  • キー
  • 値をNODE_ID
  • IDをchild_node_id

リレーションシップ(子)と引数データはノードテーブルにはなく、ノードを取得するときに結合する必要がある相互参照テーブルによって指定されることに注意してください。私はそれが "ノード"と "議論"が結合されたテーブルである間、あなたがツリーを再帰する際の中心的な俳優になる "子供"のテーブルであることを期待するでしょう。

あなたが成功裏に使用するソリューションをお知らせください。

関連する問題