2012-07-10 3 views
0

Предположим, у меня есть компьютерный интернет-магазин, и я хочу добавить новую функцию - рекламу. Являясь менеджером магазина, я хочу создать объявление о конкретном продукте. Предположим, что это происходит так: «Если клиент уже зарегистрирован не менее 2 месяцев, а при покупке стоимость его заказа превысила 150 долларов США, или продукт A OR 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) для этого. –

+0

«сохранение» это также можно рассматривать как «создание» вида :) – Randy

0

У вас есть две проблемы: Моделирование условий и их хранение в БД.

Моделирование условий: проще было бы, если бы вы могли использовать существующую модель языка сценариев или что-то в этом роде.Если вы не можете, вы можете моделировать такие условия, как: interface Expression { public T Evaluate (контекст контекста); } класс OrExpression: выражение { Expressionleft; Expressionright; } класс AndExpression: выражение { Expressionleft; Expressionright; } класс IfExpression: выражение { Expressioncondition; ExpressionthenClause; ExpressionelseClause; } класс EqualExpression: выражение { Выражение слева; Выражение справа; } класс ContextVariableValue: Expression { }

«Если клиент уже зарегистрирован в течение не менее 2-х месяцев и при покупке стоимость его заказа превысила 150 долларов США или продукт А или В, уже в своей корзине ТОГДА показать ему это объявление»

будет что-то вроде этого:

вар clientIsAlreadySignedUpFor2Months = новый GreaterThanExpression (новые ContextVariableValue ("ClientSignedUpLengthInMonths"), новый ConstantExpression (2)); var purchaseExceeds150 = new GreaterThanExpression (новый ContextVariableValue («PurchaseAmount»), новое ConstantExpression (150)); новый IfExpression (новый))

результат вар = новый AndExpression (clientIsAlreadySignedUpFor2Months, purchaseExceeds150, и т.д ...)

Чтобы сохранить его в БД вы можете сериализовать их к некоторому уравнению, как текст, а затем разобрать их или вы могли бы использовать что-то вроде

условия Id Тип ParametersType операнд1 operand2 1 GreaterThanExpression Номер 2 3 2 ContextVariableValue Количество ClientSignedUpLengthInMonths обнулить 3 ConstantExpression номер 2 нуль

и т.д ...

Я думаю, ваш лучший выбор, чтобы поджать все объявления о с их условиями в памяти, и запускать их каждый раз, когда вы могли бы быть отображающей надстройку ...

Если вы что много добавлений имеют «похожие» условия, тогда вы могли бы добавить некоторую логику, чтобы оценивать только эти условия один раз, ускорить работу и т. д.

Смежные вопросы