14

RDBMS を使用して論理式を格納するにはどうすればよいですか?

オブジェクトにタグを付けて、それらのタグに基づいて真実のステートメントを作成できるようにしたいと考えています。(これらは仮想タグと見なされる場合があります。)

タグ
new
for_sale
used
offer

ルール
second_hand_goods = (!new or used) and for_sale
new_offer = new and offer
second_hand_offer = second_hand_goods and offer

  • ルールは、タグと他のルールの両方を参照できる必要があります。
  • 休止状態から簡単にアクセスできるスキーマが望ましいでしょう。
  • できれば、1 回の選択/呼び出しでルール全体を取得できますか?

データベースに式やビジネス ルールをどのように格納していますか?

前もって感謝します。

更新
明確にするために、ルールはデータベースによって内部的に使用されるのではなく、これらのタグとルールを永続化する必要がある外部アプリケーションによって作成および使用されます。ありがとう。

4

5 に答える 5

6

実用的な観点からは、計算に必要なすべての列が同じテーブルに存在する場合、データベースに計算フィールドを作成できます。計算フィールドは単一のレコードからのみ機能します。最新の DBMS プラットフォームのほとんどは、この機能をある程度サポートしています。

理論的な観点からは、セマンティック データ モデリングに取り掛かります。これに関する最良の論文は Hammer と MacLeodsRuritanian Oil Tankersの論文であり、想像上 SDM と呼ばれるセマンティック データ モデリングの表記法について説明しています。SDM は、記述した種類のデータベース ルールをマークアップするために、構造化された英語型表記を使用します。機能を一般化する必要があり、SDM 用のパーサーを作成してもかまわない場合は、この種のロジックを構成できるルール エンジンを作成できます。このタイプのモデルは、O/R マッパーでうまく機能するように適応することも可能です。

マイナス面としては、この種のツールを作成するには非常に時間がかかるため、データ セマンティクスを管理する要件が非常に大きい場合にのみ、作成する価値があります。あなたが引用した例では、やり過ぎの領域に快適に収まりますが、問題がはるかに大きい場合は、このようなものを構築する価値があるかもしれません. パーサーを書きたくない場合は、SDM のような言語をマークアップするための XML スキーマを作成できます。

于 2009-02-13T11:44:25.157 に答える
5

ネスト/ブラケットの管理は非常に複雑になり、エラーが発生しやすくなります。私が過去にこれを行った方法は、入れ子をうまく処理できる XML を使用してロジックを定義することでした。SQL Server 2005 以降を使用すると、これを 1 つのテーブルにうまく格納することもできます。

中古品のロジックは次のように保存できます...

<logic type="and">
    <logic type="or">
        <logic type="not">
            <value type="new" />
        </logic>
        <value type="used" />
    </logic>
    <value type="for_sale" />
</logic>

申し訳ありませんが、これはあなたの質問に対する実際の回答ではなく、物事を行う別の方法にすぎません。私は過去にそれが私のために働くことを発見しました.

于 2009-02-13T11:33:03.407 に答える
1

デフォルトでは、問題を十分に理解して解決策を見つけ出すまで、ビジネス ルールをデータベースに保存しません。これらはコードに属します。ただし、ルールには常に例外があり、RDBMS のストアド プロシージャや関数を使用してこれらのルールをカプセル化できます (DB にルールがある場合)。しかし、私が言ったように、理想的には、コード内で意味のある方法でデータを解釈します。

アップデート

申し訳ありませんが、私はあなたの質問に答えていませんでした。DBに関数がある場合は、パラメーターを渡してスカラー値を返すことができる関数を使用するか、ストアドプロシージャを使用できます。式ごとに 1 つと、何らかの方法で式を結合するためのより大きな手順が必要になる場合があります。

于 2009-02-13T11:29:24.400 に答える
0

このようなものはどうですか:

Tables:
 tags( id, name )
 goods ( id, ... )
 goods_tags_mm ( tag_id, good_id )
 rules ( id, name )
 rules_cnf ( id, rule_id )
 rules_cnf_terms ( rules_cnf_id, tag_id )
于 2009-02-13T14:16:20.753 に答える
0

1つのテーブルを使用します

tags(id,name,type,expression,order)
  • タイプは、タグが通常か計算かを示します。
  • orderは、新しい計算タグを追加すると並べ替えられ、これらのタグの計算の順序を指定します...
  • は行を挿入する前に解析およびチェックされますが、GUI を使用して構築することもできます (Oracle ディスカバーがこれらのことを行う方法と同様)。
  • 通常のタグをアイテムにリンクするだけです

あなたの例では、中古品は中古品を提供する前に計算する必要がありますが、他のすべては依存関係なしで計算できます。

1,'new',1,'',NULL
2,'for_sale',1,'',NULL
3,'used',1,'',NULL
4,'offer',1,'',NULL
5,'second_hand_goods',2,'(!new or used) and for_sale',1
6,'new_offer',2,'new and offer',1
7,'second_hand_offer',2,'second_hand_goods and offer',2

アイテムは for_sale のみでタグ付けでき、計算すると次のようになります。

second_hand_goods,second_hand_offer

直接タグと計算されたタグを含む、アイテムのすべてのタグのリストを提供する関数があります。

for_sale,second_hand_goods,second_hand_offer
于 2009-03-10T07:51:20.053 に答える