Esquema de banco de dados para precificação de produtos (pacotes, promoções, com base em qtd, oferta por tempo limitado ...)


11

Estou trabalhando em um novo ponto de venda para uma empresa que produz produtos por preços diferentes, dependendo do mix de produtos.

Todos os produtos têm um preço base.

Para explicar meu problema, usarei as seguintes informações:

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 empresa possui Pacotes, por exemplo, Pacote "Combo": para o produto A ou B, se você escolher 1 de Q ou R e 1 de X, Y ou Z, obtém um desconto de US $ 20.

Caso A: Às vezes, os clientes adicionam um produto base ao fazer um pedido, por exemplo: eles não são do Produto A e adicionam o Produto Q e o Produto P a ele para criar um pacote com um preço com desconto. Eles podem acrescentar que desejam 1 produto B com 1 R e 1 Z.

Caso B: Às vezes, os clientes adicionam 1 A e 2 B, 2 Q, 1 S, 2 X e 1 Z. De acordo com as regras estabelecidas no pacote "Combo", apenas 2 combos se aplicariam porque S não é um item de combinação.

Outras promoções dependem da quantidade; portanto, se você comprar 2 de B, terá 20% de desconto e / ou depende do tempo, só será válido depois das 17h ou antes dos 10% de desconto antes das 10h. Outra promoção pode depender de quando sua última compra ocorreu ou se você comprou mais de US $ X no prazo de Y.

Meus problemas:

1) Como estruturo as tabelas para criar os diferentes pacotes ou promoções de uma maneira que seja muito flexível para adicionar diferentes tipos de promoções com requisitos diferentes?

2) Quando eles solicitam como o Caso B (ou uma combinação de Caso A e Caso B), como estruturo minha consulta para que eu possa testar para ver quais mix (es) de produto estão no pedido e atualizar os preços / descrições de acordo ? Por fim, o melhor resultado para essa consulta retornaria quais pacotes e promoções têm os requisitos atendidos, na ordem dos quais traz o maior benefício para o cliente (ou seja, talvez o que eles pediram cumpra os requisitos das promoções 1 e 3, mas a promoção 3 é menos dispendiosa. deve trabalhar com várias promoções).

Obrigado antecipadamente pela ajuda!

ATUALIZAÇÃO # 1

Para melhor descrever os problemas em questão e atualizar o trabalho realizado até agora para resolvê-los , incluí um ERD do Modelo de Produto limitado às entidades e atributos que afetam o problema (ou seja, o inventário não está em jogo aqui, portanto, nenhum inventário entidades estão presentes).

insira a descrição da imagem aqui

Também estou incluindo dados de amostra das entidades e atributos que afetam essa pergunta (para simplificar a leitura dos dados, estou colocando nomes / descrições no lugar de Chaves estrangeiras):

Aqui está um link para um fluxograma, fornecendo um exemplo de combinação, uma maneira rápida e visual de entender a estrutura da tabela.

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

Assim, com a pesquisa e o suporte fornecidos pela comunidade até o momento, consegui resolver o Problema 1. Na verdade, eu fiz isso com mais flexibilidade do que eu pensava que poderia fazer na primeira implantação do sistema.

Embora tenha havido avanços no Problema 2, ele não foi resolvido com satisfação. Houve algumas idéias sobre como fazer isso, Neil McGuilgan fez uma ótima pergunta que levava a uma possível solução usando a Divisão Relacional (dba.stackexchange.com/questions/45829/what-is-the-name-of-this-type- exemplo de consulta e o que é um exemplo eficiente) e este livro (www.amazon.com/books/dp/0471380237) ajudaram muito. No entanto, esta solução no momento, e pelo que entendi, funciona apenas com "um" registro (combinação) de cada vez. Se um cliente subir e disser que quer 2 cheeseburgers, 1 hambúrguer, 1 suco de maçã pequeno, 1 coca-cola, 1 batata frita e 2 anéis de cebola, eu preciso de uma maneira de detectar se existe apenas uma combinação na mistura e adicionar a outra produtos a preço base. Se houver várias combinações de combinação, eu

Uma idéia que surgiu para solucionar o problema dois é adicionar e atribuir ao sinalizador COMPONENTE DO PRODUTO o principal produto do combo (por exemplo, hambúrguer). Em seguida, ao executar o processo de precificação, consulte quais produtos do pedido são os principais produtos de um "pacote", relacionando a consulta ao desconto dado pela tabela PRICE COMPONENT e solicitando por esse valor (decrescente) e nessa ordem de pacotes. para ver se você pode criar um "pacote" com os produtos não principais restantes com uma consulta e fazer um loop do processo até que não haja mais produtos principais ou que não haja mais produtos não principais no restante.


O que você fez até agora ? Mostre-nos algum diagrama de ER.
Tulains Córdova

@ user61852 Faço a maioria dos meus ERDs manualmente. Você pode recomendar uma ferramenta para fazê-los no computador para que eu possa compartilhá-lo? (espero que um livre :)
cml

@ user61852 Encontrei gliffy.com, que está provando ser bastante útil. Estou trabalhando para montar o que trabalhei para atualizar minha pergunta.
Cml

@ user61852 Adicionei a atualização nº 1 para mostrar dados de ERD, fluxograma, avanços e exemplo de tabela.
cml 9/07/2013

Respostas:


2

Isso pode ficar complicado ...

1) Como estruturo as tabelas para criar os diferentes pacotes ou promoções de uma maneira que seja muito flexível para adicionar diferentes tipos de promoções com requisitos diferentes?

Você pode começar com uma packaged_withtabela para determinar quais produtos podem ser agrupados e empacotados:

pacote
-------
  ID (PK)
  nome

package_group
-------------
  package_id (FK para package.id)
  nome

packaged_with
-------------
  package_group_id (FK para package_group.id)
  product_id (FK para product.id)
  can_be_packaged_with (FK para product.id)

package_grouprefere-se a package. packaged_withrefere-se a productse package_groups, de modo que uma linha em packaged_withmostra que os produtos de um produto pode ser embalado com, e um pacote podem ser constituídos de vários grupos.

Os dados ficariam assim:

pacote
-------
ID nome
------------
1 | Combo

package_group
------------
ID nome
---------
1 | Grupo QR
2 Grupo XYZ

packaged_with
-------------
package_group_id | product_id | can_be_packaged_with
----------------------------------------------
1 | A Q
1 | A R
2 A X
2 A Y
2 A Z
1 | B Q
1 | B R
2 B X
2 B Y
2 B Z

Isso o ajudará com os próprios pacotes do produto. Tenho algumas idéias para o resto da sua pergunta, mas não tenho tempo para concluir esta resposta agora ...


Promoções

Você lista muitos tipos de promoções. Você pode procurar algum tipo de mecanismo de regras, mas tentarei simplificar as coisas, mas ainda assim ... Isso ficará complicado.

Vamos começar com promoções simples em que um preço é descontado em uma determinada porcentagem:

percent_discount
----------------
  ID (PK)
  nome
  percent_amount

product_promotions
------------------
  ID (PK)
  product_id (FK para product.id)
  promotion_id (FK para percent_discount.id)
  data de início
  data final

Aqui temos uma tabela que armazena qual a porcentagem que você obtém do produto. Outra tabela, na verdade, vincula produtos à taxa de desconto e também inclui uma data de início e de término para que você saiba se o desconto é aplicável em qualquer data.

Ideias para as outras promoções mais tarde ...


Estou ansioso para ler o resto da sua resposta quando tiver tempo para escrevê-la. Obrigado pela ajuda.
Cml4

Definitivamente vou analisar os "mecanismos de regras"! Se você tiver bons links de recursos, envie-os para mim! Meu maior problema é saber determinar quais promoções se aplicam a uma lista desordenada e não agrupada de itens de pedidos (Caso B).
cml 08/07/19

@ cml: Eu sei que existem produtos comerciais que provavelmente já possuem os recursos que você deseja. Uma que eu conheço se chama Hybris, ouvi dizer que tem um sistema de promoções muito sofisticado.
FrustratedWithFormsDesigner

Eu adicionei a atualização # 1
cml 9/07/2013

1

Embora seja um tópico de 3 anos, ainda estou respondendo, pensando que pode ser útil para alguém.

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             

Detalhes da oferta ------------

 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

Para construir um offerDetails, você deve fornecer um obrigatório, um mixgropu1 e amixGropu2. Portanto, caseB, tem apenas 2 ofertas da seguinte forma:

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.

Outras ofertas são baseadas na lógica de negócios: Para desconto de oferta por quantidade: crie uma consulta para encontrar a contagem de B em uma oferta para um cliente. vamos chamá-lo de QTYB. encontre QTYB% 2 e multiplique pelo valor QuantityOffer (que é $ 20)

Para a oferta de estatísticas, basta adicionar outro bit chamado wonPoint para a compra de um cliente. e defina o wonPoint como uma data de validade. o ponto ganho pode ser igual ao valor adquirido. Verifique se o valor comprado> = $ X, eles emitem desconto conforme a política.

Semelhante é a comparação do horário do pedido, se for antes das 17h e depois das 10h, em seguida, emitir 5% e emitir 10% de desconto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.