0

オンラインのコンピュータ ショップがあり、広告という新しい機能を追加したいとします。ショップのマネージャーとして、特定の商品に関する広告を作成したいと考えています。たとえば、「クライアントがすでに少なくとも 2 か月間サインアップしており、購入中に注文の金額が 150 ドルを超えた場合、または製品 A または B がすでにショッピング カートに入っている場合、この広告を表示します」。

私の質問は、そのようなステートメント(条件「AまたはB」、「AおよびB」、「(AまたはB)およびC」など)をデータベースに保存する方法と、レコードを選択して表示する方法(またはない)希望の広告?

私のアイデアの1つ:

Adverts
1. id,
2. name,
3. description,
…
4. criterias_pattern [i.e “(1 OR 5) AND 4”]

2 番目のテーブル:

AdvertsCriterias
1. id
...
2. type
3. value

つまり、「criterias_pattern」フィールドに格納されたパターンを解析し、criterias_id を抽出して、条件を確認します。

うまくいくはずですが、多くの明らかな欠点があります。

4

2 に答える 2

0

2 つの問題があります。条件のモデル化と、DB への保存です。

条件のモデル化: 既存のスクリプト言語モデルなどを使用できれば、おそらく簡単です。できない場合は、次のような条件をモデル化できます。 interface Expression { public T Evaluate(Context context); } クラス OrExpression : 式 { Expressionleft; 表現権; } クラス AndExpression : 式 { Expressionleft; 表現権; } class IfExpression : Expression { Expressioncondition; } ExpressionthenClause; ExpressionelseClause; } クラス EqualExpression : 式 { 式が左に; } 表現権; } class ContextVariableValue : 式 { }

「クライアントがすでに少なくとも 2 か月間サインアップしており、購入中に注文額が 150 ドルを超えた場合、または製品 A または B がすでにショッピング カートに入っている場合は、この広告を表示してください。」</p>

そのようなものになります:

var clientIsAlreadySignedUpFor2Months = new GreaterThanExpression(new ContextVariableValue("ClientSignedUpLengthInMonths"), new ConstantExpression(2)); var purchaseExceeds150 = new GreaterThanExpression(new ContextVariableValue("PurchaseAmount"),new ConstantExpression(150)); new IfExpression(new ) )

var result = new AndExpression(clientIsAlreadySignedUpFor2Months, purchaseExceeds150 など...)

それをDBに保存するには、それらをテキストなどの方程式にシリアル化してから解析するか、次のようなものを使用できます

条件 Id タイプ ParametersType Operand1 Operand2 1 GreaterThanExpression 数値 2 3 2 ContextVariableValue 数値 ClientSignedUpLengthInMonths null 3 ConstantExpression 数値 2 null

等...

私はあなたの最善の策は、すべての広告を条件付きでメモリにプリロードし、追加を表示するたびにそれらを実行することだと思います...

多くの追加に「類似した」条件があることを検出した場合は、ロジックを追加して、それらの条件を一度だけ評価したり、速度を上げたりすることができます...

于 2012-07-10T21:39:50.280 に答える
0

ランダムな考え -

評価を行う実際のSQL WHERE句を保存してみませんか。少なくとも、独自の構文とパーサーを再発明する必要はありません。

于 2012-07-10T12:25:27.323 に答える