我们假设我有一个在线电脑商店,我想添加一个新功能 - 广告。 作为商店的经理,我想创建一个关于特定产品的广告。让我们说它是这样的:“如果一个客户已经注册至少2个月并且在购买期间他的订单价值超过150美元或产品A或B已经在他的购物车中,那么向他展示这个广告”。< / p>
我的问题是如何在数据库中存储这些语句(条件“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 :(得分:0)
随机思考 -
为什么不存储执行评估的实际sql WHERE子句。至少那时你不需要重新发明自己的语法和解析器。
答案 1 :(得分:0)
您有两个问题:建模条件,并将它们存储在数据库中。
对条件进行建模:如果您可以使用现有的脚本语言模型或类似的东西,则可能会更容易。如果你不能,你可以建模如下条件: 界面表达 { public T Evaluate(Context context); } class OrExpression:Expression { Expressionleft; Expressionright; } class AndExpression:表达式 { Expressionleft; Expressionright; } class IfExpression:Expression { Expressioncondition; ExpressionthenClause; ExpressionelseClause; } class EqualExpression:Expression { 表达式左; 表达权; } class ContextVariableValue:Expression { }
“如果客户已经注册至少2个月并且在购买期间,他的订单价值超过150美元或产品A或B已经在他的购物车中,那么就向他展示这个广告”
会是这样的:
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类型参数类型操作数1操作数2 1 GreaterThanExpression Number 2 3 2 ContextVariableValue Number ClientSignedUpLengthInMonths null 3 ConstantExpression Number 2 null
等...
我认为最好的选择是将所有广告预先加载到内存条件中,并在每次显示添加内容时运行它们...
如果您发现很多添加物具有“相似”条件,那么您可以添加一些逻辑来仅评估这些条件一次,以加快速度等等......