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,然后检查条件。

它应该可以工作,但它有许多明显的缺点。

4

2 回答 2

0

胡思乱想——

为什么不存储可以进行评估的实际 sql WHERE 子句。至少那时您不需要重新发明自己的语法和解析器。

于 2012-07-10T12:25:27.323 回答
0

您有两个问题:对条件进行建模,并将它们存储在数据库中。

建模条件:如果您可以使用现有的脚本语言模型或类似的东西,可能会更容易。如果不能,您可以对条件进行建模,例如: interface Expression { public T Evaluate(Context context); } 类 OrExpression : 表达式 { Expressionleft; 表达权;} 类 AndExpression : 表达式 { Expressionleft; 表达权;} 类 IfExpression : 表达式 { 表达式条件;表达式然后从句;表达式其他子句;} 类 EqualExpression : 表达式 { 表达式左; 表达权;} 类 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)); 新的IfExpression(新))

var result = new AndExpression(clientIsAlreadySignedUpFor2Months, purchaseExceeds150, 等等...)

要将其存储在数据库中,您可以将它们序列化为文本等方程式,然后解析它们,或者您可以使用类似的东西

条件 Id 类型 ParametersType Operand1 Operand2 1 GreaterThanExpression Number 2 3 2 ContextVariableValue Number ClientSignedUpLengthInMonths null 3 ConstantExpression Number 2 null

ETC...

我认为您最好的选择是将所有广告及其条件预加载到内存中,并在每次可以显示添加时运行它们...

如果您检测到很多添加具有“相似”条件,那么您可以添加一些逻辑来仅评估这些条件一次,以加快速度等......

于 2012-07-10T21:39:50.280 回答