2012-07-10 44 views
0

我們假設我有一個在線電腦商店,我想添加一個新功能 - 廣告。 作爲本店經理,我想創建一個關於特定產品的廣告。比如說:「如果客戶已經註冊了至少2個月,並且在購買期間他的訂單價值超過了150美元或產品A或B已經在他的購物車中,那麼請向他展示此廣告。」存儲條件以供從數據庫中進一步選擇。設計挑戰

我的問題是如何在數據庫中存儲這些語句(條件「A或B」,「A和B」,「(A或B)和C」等),然後如何選擇記錄並顯示(或不)所需的廣告?

我的一個想法:

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

二表:

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

簡而言之: 我分析存儲在「criterias_pattern」現場,提取criterias_id的圖案,然後我檢查的條件。

它應該工作,但它有許多明顯的缺點。

回答

0

隨機思考 -

爲什麼不存儲實際的SQL WHERE子句將做評估。至少你不需要重新創建自己的語法和解析器。

+0

我同意這會更簡單和容易。但是我仍然擔心這是否是正確的方式(存儲sql子句)。 – 2012-07-10 13:36:25

+0

'存儲'這也可以被視爲'創造'一個觀點:) – Randy 2012-07-10 13:38:31

0

您有兩個問題:對條件建模,並將它們存儲在數據庫中。

建模條件:較容易的很可能是,如果你可以使用現有的腳本語言模型,或者類似的東西。如果你不能模擬如下條件: interface Expression public T Evaluate(Context context); } class OrExpression:Expression { Expressionleft; Expressionright; } class AndExpression:Expression { Expressionleft; Expressionright; } class IfExpression:Expression { Expressioncondition; ExpressionthenClause; ExpressionelseClause; } class EqualExpression:Expression { Expression left; 表達權; } 類ContextVariableValue:表達 { }

「IF至少2個月,並在購買時客戶已經簽署了他的訂單價值超過$ 150或產品A或B已經在他的購物車然後告訴他這則廣告」

將是類似的東西:

VAR clientIsAlreadySignedUpFor2Months =新GreaterThanExpression(新ContextVariableValue( 「ClientSignedUpLengthInMonths」),新的常量表達式(2)); var newExceeds150 = new GreaterThanExpression(new ContextVariableValue(「PurchaseAmount」),new ConstantExpression(150)); 新IfExpression(新))

VAR的結果=新AndExpression(clientIsAlreadySignedUpFor2Months,purchaseExceeds150,等...)

若要將其存儲在數據庫中,你可以將它們序列化到像文本一些公式,然後分析它們或者你可以使用類似

條件 ID類型ParametersType OPERAND1 Operand2中 1 GreaterThanExpression數量1 2 3 2 ContextVariableValue數ClientSignedUpLengthInMonths空 3常量表達式2號空

等等

我認爲最好的方法,就是提前下載所有他們在內存條件advertisments,並運行它們,你可以顯示一個附加每次...

如果您檢測到許多添加有「相似」的條件,那麼你可以添加一些邏輯來只評估一次這些條件,以加快速度等等...