存储从数据库中进一步选择的条件。设计挑战

时间:2012-07-10 12:20:23

标签: database database-design

我们假设我有一个在线电脑商店,我想添加一个新功能 - 广告。 作为商店的经理,我想创建一个关于特定产品的广告。让我们说它是这样的:“如果一个客户已经注册至少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然后检查条件。

它应该有效,但它有许多明显的缺点。

2 个答案:

答案 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

等...

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

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