Схема базы данных для ценообразования (пакеты, рекламные акции, кол-во, ограниченное время…)

11

Я работаю над новой точкой продаж для компании, которая производит товары по разным ценам в зависимости от ассортимента.

Все товары имеют базовую цену.

Чтобы объяснить мою проблему, я буду использовать следующую информацию:

Product         Category        Price
A               1               45
B               1               70
Q               2               20
R               2               27
S               2               15
X               3               17
Y               3               22
Z               3               16

У компании есть Пакеты, например, Пакет «Комбо»: для продукта A или B, если вы выберете 1 из Q или R и 1 из X, Y или Z, вы получите скидку в 20 долларов.

Случай A: Иногда клиенты добавляют к базовому продукту при размещении заказа, например: они не относятся к одному из продуктов A и добавляют к нему продукт Q и продукт P, чтобы создать пакет со сниженной ценой. Затем они могут добавить, что они хотят 1 продукта B с 1 R и 1 Z.

Случай B: иногда клиенты добавляют 1 A ​​и 2 B, 2 Q, 1 S, 2 X и 1 Z. В соответствии с правилами, установленными в пакете «Combo», будут применяться только 2 комбинации, поскольку S не является комбинированным элементом.

Другие акции зависят от количества, поэтому, если вы покупаете 2 из B, вы получаете скидку 20% и / или зависит от времени, это действует только после 17:00 или до 10%, если до 10:00. Другая акция может зависеть от того, когда произошла ваша последняя покупка, или если вы приобрели более $ X в течение периода Y.

Мои проблемы:

1) Как мне структурировать таблицы, чтобы я мог создавать различные пакеты или рекламные акции таким образом, чтобы можно было очень гибко добавлять различные типы рекламных акций с различными требованиями?

2) Когда они заказывают, например, случай B (или сочетание случая A и случая B), как мне структурировать свой запрос, чтобы я мог проверить, какие товарные позиции находятся в заказе, и соответственно обновить цены / описания ? В конечном счете, лучший результат для этого запроса будет возвращать, какие пакеты и рекламные акции соответствуют требованиям, и в этом случае клиент получает наибольшую выгоду (т. Е., Возможно, то, что он заказал, соответствует требованиям для рекламной акции 1 и 3, но рекламная акция 3 обходится дешевле. должен работать с несколькими акциями).

Заранее спасибо за помощь!

ОБНОВЛЕНИЕ № 1

Чтобы лучше описать имеющиеся проблемы и обновить проделанную до сих пор работу по их решению, я включаю ERD модели продукта, ограниченную сущностями и атрибутами, которые влияют на проблему (т. Е. Инвентарь здесь не задействован , поэтому нет инвентаря сущности присутствуют).

введите описание изображения здесь

Я также включаю примеры данных от сущностей и атрибутов, которые влияют на этот вопрос (чтобы упростить чтение данных, я помещаю имя / описание вместо внешних ключей):

Вот ссылка на блок-схему, на которой приведен пример комбо, быстрый и наглядный способ понять структуру таблицы.

PRODUCT
---------
ID  Name
================================
1   Hamburger
2   Cheeseburger
3   Bacon Hamburger
4   Bacon Cheeseburger
5   Orange Juice
6   Apple Juice
7   Coffee
8   Coke
9   French Fries
10  Onion Rings
11  Soup du Jour
12  Hamburger Combo
13  CheeseBurger Combo
14  Bacon Hamburger Combo
15  Bacon Cheeseburger Combo
16  Combo Side
17  Combo Beverage
18  Small Orange Juice
19  Large Orange Juice
20  Small Apple Juice
21  Large Apple Juice
22  Add Extra Patty
23  Add Avocado

PRODUCT COMPONENT
------------------
productFrom                 productTo       
===================================================
Hamburger Combo             Hamburger
Hamburger Combo             Combo Side
Hamburger Combo             Combo Beverage
CheeseBurger Combo          Cheeseburger
CheeseBurger Combo          Combo Side
CheeseBurger Combo          Combo Beverage
Bacon Hamburger Combo       Bacon Hamburger
Bacon Hamburger Combo       Combo Side
Bacon Hamburger Combo       Combo Beverage
Bacon Cheeseburger Combo    Bacon Cheeseburger
Bacon Cheeseburger Combo    Combo Side
Bacon Cheeseburger Combo    Combo Beverage

PRODUCT FEATURE
----------------
ID  Description
=======================
1   Combo Side Option
2   Combo Beverage
3   Juice
4   Orange Juice Size
5   Apple Juice Size
6   Extras

PRODUCT FEATURE APPLICABILITY
------------------------------
product                     productFeature  ProductFeatureApplicabilityType
============================================================================
Hamburger Combo             Combo Side      Required
Hamburger Combo             Juice Flavor    Required
Cheeseburger Combo          Combo Side      Required
Cheeseburger Combo          Juice Flavor    Required
Bacon Hamburger Combo       Combo Side      Required
Bacon Hamburger Combo       Juice Flavor    Required
Bacon Cheeseburger Combo    Combo Side      Required
Bacon Cheeseburger Combo    Juice Flavor    Required


PRODUCT FEATURE APPLICABILITY
------------------------------
productFeature  product             ProductFeatureApplicabilityType
============================================================================
Combo Side      Hamburger Combo             Required
Combo Beverage  Hamburger Combo             Required
Extras          Hamburger Combo             Optional
Combo Side      Cheeseburger Combo          Required
Combo Beverage  Cheeseburger Combo          Required
Extras          Cheeseburger Combo          Optional
Combo Side      Bacon Hamburger Combo       Required
Combo Beverage  Bacon Hamburger Combo       Required
Extras          Bacon Hamburger Combo       Optional
Combo Side      Bacon Cheeseburger Combo    Required
Combo Beverage  Bacon Cheeseburger Combo    Required
Extras          Bacon Cheeseburger Combo    Optional




OPTIONAL FEATURE
------------------
productFeatureFrom  Product             ProductFeatureTo        
=============================================================
Combo Side Option   French Fries
Combo Side Option   Onion Rings
Combo Side Option   Soup du Jour
Combo Beverage                          Juice
Combo Beverage      Coffee
Juice                                   Orange Juice Size
Juice                                   Apple Juice Size
Orange Juice Size   Orange Apple Juice
Orange Juice Size   Orange Apple Juice
Apple Juice Size    Small Apple Juice
Apple Juice Size    Large Apple Juice
Extras              Add Extra Patty
Extras              Add Avocado

Таким образом, благодаря исследованиям и поддержке, предоставленной сообществом, пока я не узнал, я смог решить проблему № 1. На самом деле, я сделал это с большей гибкостью, чем я думал, что смог сделать при первом развертывании системы.

Несмотря на то, что были проблемы с проблемой 2, она не решается к удовлетворению. Были некоторые идеи о том, как это сделать, Нил МакГилган задал отличный вопрос, ведущий к возможному решению с использованием реляционного подразделения (dba.stackexchange.com/questions/45829/what-is-the-name-of-this-type- примера запроса и того, что является эффективным), и эта книга (www.amazon.com/books/dp/0471380237) очень помогла. Однако это решение в настоящее время, и, насколько я понимаю, работает только с «одной» записью (комбо) за раз. Если клиент заходит и говорит, что хочет 2 чизбургера, 1 гамбургер, 1 маленький яблочный сок, 1 колу, 1 картофель фри и 2 луковых кольца, мне нужен способ обнаружить, что в миксе есть только одно комбо, и добавить другое продукты по базовой цене. Если есть несколько комбинаций комбо, я

Одна идея, которую я пришёл для решения второй проблемы, заключается в добавлении атрибута PRODUCT COMPONENT и присвоении ему основного продукта для комбо (т. Е. Гамбургера). Затем при запуске процесса ценообразования запросите, какие продукты в заказе являются основными продуктами в «пакете», связав запрос со скидкой, указанной в таблице PRICE COMPONENT, и упорядочив по этому значению (по убыванию), и в этом порядке пакетов проверьте чтобы узнать, можете ли вы создать «пакет» с оставшимися неосновными продуктами с помощью запроса и выполнить цикл, пока не останется больше основных продуктов или не останется неосновных продуктов в оставшейся части.

CML
источник
Что ты на сегодня сделал? Покажите нам диаграмму ER.
Тулаинс Кордова
@ user61852 Я делаю большинство своих ERD вручную. Можете ли вы порекомендовать инструмент, чтобы сделать их на компьютере, чтобы я мог поделиться им? (надеюсь бесплатный :)
cml
@ user61852 Я нашел gliffy.com, который оказался довольно полезным. Я работаю над созданием того, над чем я работал, чтобы обновить мой вопрос.
13
@ user61852 Я добавил обновление # 1 для отображения ERD, блок-схемы, достижений и данных примера таблицы.
См

Ответы:

2

Это может быть сложно ...

1) Как мне структурировать таблицы, чтобы я мог создавать различные пакеты или рекламные акции таким образом, чтобы можно было очень гибко добавлять различные типы рекламных акций с различными требованиями?

Вы можете начать с packaged_withтаблицы, чтобы определить, какие продукты могут быть сгруппированы и упакованы вместе:

пакет
-------
  id (PK)
  имя

package_group
-------------
  package_id (от FK до package.id)
  имя

packaged_with
-------------
  package_group_id (от FK до package_group.id)
  product_id (от FK до product.id)
  can_be_packaged_with (от FK до product.id)

package_groupотносится к package. packaged_withобозначает productsи package_groups, так что строка в packaged_withпоказывает, с какими продуктами может быть упакован продукт, а упаковка может состоять из нескольких групп.

Данные будут выглядеть так:

пакет
-------
ID | имя
------------
1 | Combo

package_group
------------
ID | имя
---------
1 | QR группа
2 | XYZ группа

packaged_with
-------------
package_group_id | product_id | can_be_packaged_with
----------------------------------------------
1 | A | Q
1 | A | р
2 | A | Икс
2 | A | Y
2 | A | Z
1 | Б | Q
1 | Б | р
2 | Б | Икс
2 | Б | Y
2 | Б | Z

Это поможет вам с самими пакетами продуктов. У меня есть некоторые идеи для остальной части вашего вопроса, но у меня нет времени, чтобы закончить этот ответ прямо сейчас ...


Акции

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

Давайте начнем с простых рекламных акций, где цена снижена на определенный процент:

percent_discount
----------------
  id (PK)
  имя
  percent_amount

product_promotions
------------------
  id (PK)
  product_id (от FK до product.id)
  продвижение_ид (от FK до процентов_диск.ид)
  Дата начала
  Дата окончания

Здесь у нас есть таблица, в которой хранится процент, который вы получаете за продукт. Другая таблица фактически связывает продукты со ставкой дисконтирования, а также включает дату начала и окончания, чтобы вы знали, применима ли скидка к какой-либо конкретной дате.

Идеи для других рекламных акций, которые будут позже ...

FrustratedWithFormsDesigner
источник
Я с нетерпением жду прочтения ответа от вас, когда у вас будет время написать его. Спасибо за вашу помощь.
см
Я определенно собираюсь заглянуть в «правила-движки»! Если у вас есть хорошие ссылки на ресурсы, отправьте их мне! Моя самая большая проблема, которую нужно знать, - это определение того, какие рекламные акции применяются к неупорядоченному, разгруппированному списку элементов заказа (случай B).
13
@cml: я знаю, что есть коммерческие продукты, которые, вероятно, уже обладают необходимыми вам возможностями. Один из тех, кого я знаю, называется Hybris, у меня, как я слышал, очень сложная система рекламных акций.
FrustratedWithFormsDesigner
Я добавил обновление # 1
cml
1

Хотя это 3-х летняя нить, я все же отвечаю, думая, что это может кому-то пригодиться.

Table Structure
Table_Offer
--------
ID FK
Name   
start time  
end time   

MandatoryGroup
--------
ProductId (FK to product)

MixGroup1
--------
ProductId (FK to product)


MixGroup2
--------
ProductId (FK to product)


Table_offerDetails
------------------
ID PK
offerId (FK to table_offer)
MandatoryProduct(FK to MandatoryProducts.productID
firstProduct ( fk to MixGroup1.productId)
secondProduct (FK to MixGroup2.productId)

Offer
----
 ID    name    startDate  EndDate 
---    ----     --------   ------
1       COMBO   


MandatoryGroup
-------------
 ID    name 
 ---   ---- 
1      A
2      B


MixGroup1
---------
 ID    name 
 ---   ---- 
 3      P      
 4      Q

MixGroup2
---------
 ID    name 
 ---   ---- 
 5      x      
 6      Y
 7      Z



 OfferHeader
-------------
ID  Customer count(B) B_disc time_disc  stat_disc DiscTotal orderPayableTotal
--  --------- -------  ----   --------  ---------  --------  ------------    
1     BOB     2         20      5         2             

OfferDetails ------------

 ID   offerID   MandatoryProduct     1stProduct    2ndProduct
----  -------    ---------------     ----------    ----------
1       1         A                     P              X
2       1         A                     P              Y
3       1         A                     P              Z
4       1         A                     Q              X
5       1         A                     Q              Y
6       1         A                     Q              Z
7       1         B                     P              X
8       1         B                     P              Y
9       1         B                     P              Z
10      1         B                     Q              X
11      1         B                     Q              Y
12      1         B                     Q              Z

Чтобы построить offerDetails, вы должны предоставить обязательный, mixgropu1 и amixGropu2. Итак, у caseB есть только 2 предложения:

1 A and 2 B, 2 Q, 1 S, 2 X and 1 Z
2B 2Q and 2X =2 offers
1A 1Q and 1X=1st offer
1B 1Q and 1X=2nd Offer ... etc other combinations are vivid.

Другие предложения основаны на бизнес-логике: Для скидки на количество предложений: создайте запрос, чтобы найти количество B в предложении для клиента. давайте назовем это QTYB. найдите QTYB% 2 и умножьте его на значение amountOffer (которое составляет $ 20)

Для статистического предложения, просто добавьте еще один бит под названием earnedPoint для покупки клиента. и установите заработанные очки на срок действия. Заработанный балл может быть таким же, как купленная сумма. Проверьте, если сумма покупки> = $ X, они выдают скидку в соответствии с политикой.

Аналогичным является сравнение времени заказа, если его до 5 вечера и после 10 утра, то 5%, а 10% скидка.

123456
источник