Schema di database per prodotti a prezzo (pacchetti, promozioni, quantità basata, offerta a tempo limitato ...)


11

Sto lavorando a un nuovo punto vendita per un'azienda che produce prezzi diversi a seconda del mix di prodotti.

Tutti i prodotti hanno un prezzo base.

Per spiegare il mio problema, userò le seguenti informazioni:

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

La società ha pacchetti, ad esempio il pacchetto "Combo": per il prodotto A o B, se si sceglie 1 di Q o R e 1 di X, Y o Z, si ottiene uno sconto di $ 20.

Caso A: a volte i clienti si aggiungono a un prodotto di base quando effettuano un ordine, ad esempio: non fanno parte del Prodotto A e aggiungono il Prodotto Q e il Prodotto P a quello per creare un pacchetto che ha un prezzo scontato. Quindi potrebbero aggiungere che vogliono 1 del prodotto B con 1 R e 1 Z.

Caso B: a volte i clienti aggiungeranno 1 A e 2 B, 2 Q, 1 S, 2 X e 1 Z. Secondo le regole stabilite dal pacchetto "Combo", si applicherebbero solo 2 combo poiché S non è un articolo combinato.

Altre promozioni dipendono dalla quantità, quindi se acquisti 2 di B ricevi uno sconto del 20% e / o dipende dal tempo, è valido solo dopo le 17:00 o prima del 10% se prima delle 10:00. Un'altra promozione potrebbe dipendere da quando si è verificato il tuo ultimo acquisto o se hai acquistato più di $ X in Y.

I miei problemi:

1) Come strutturare le tabelle in modo da creare i diversi pacchetti o promozioni in modo molto flessibile per aggiungere diversi tipi di promozioni con requisiti diversi?

2) Quando ordinano come il Caso B (o una combinazione di Caso A e Caso B) come strutturare la mia query in modo da poter verificare quali mix di prodotti sono nell'ordine e aggiornare i prezzi / le descrizioni di conseguenza ? In definitiva, il risultato migliore per questa query restituirebbe quali pacchetti e promozioni soddisfano i requisiti in ordine di cui offre il massimo beneficio per il cliente (vale a dire forse ciò che hanno ordinato soddisfa i requisiti per la promozione 1 e 3, ma la promozione 3 è meno costosa. deve funzionare con più promozioni).

Grazie in anticipo per l'aiuto!

AGGIORNAMENTO # 1

Per descrivere meglio i problemi a portata di mano e aggiornare il lavoro svolto finora per risolverli, sto includendo un ERD del modello del prodotto limitato alle entità e agli attributi che influenzano il problema (vale a dire che l'inventario non è in gioco qui, quindi nessun inventario le entità sono presenti).

inserisci qui la descrizione dell'immagine

Includo anche dati di esempio delle entità e degli attributi che influiscono su questa domanda (per semplificare la lettura dei dati, inserisco il nome / la descrizione al posto delle chiavi esterne):

Ecco un collegamento a un diagramma di flusso che fornisce un esempio di combo, un modo rapido e visivo per comprendere la struttura della tabella.

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

Quindi, con la ricerca e il supporto forniti dalla comunità fino a che non ne sono stato a conoscenza, sono stato in grado di risolvere il problema n. 1. In effetti, l'ho fatto con una maggiore flessibilità di quanto pensassi di poter fare nella prima distribuzione del sistema.

Tutti sebbene ci siano stati progressi con il Problema 2, non è risolto con soddisfazione. Ci sono state alcune idee su come farlo, Neil McGuilgan ha posto una grande domanda che portava a una possibile soluzione usando la divisione relazionale (dba.stackexchange.com/questions/45829/what-is-the-name-of-this-type- of-query-and-what-is-an-efficient-example) e questo libro (www.amazon.com/books/dp/0471380237) ha aiutato molto. Tuttavia questa soluzione al momento, e come ho capito, funziona solo con "un" record (combo) alla volta. Se un cliente si avvicina e dice che vuole 2 cheeseburger, 1 hamburger, 1 piccolo succo di mela, 1 coca cola, 1 patatine fritte e 2 anelli di cipolla, ho bisogno di un modo per rilevare che c'è solo una combinazione nel mix e aggiungere l'altro prodotti a prezzo base. Se ci sono più combinazioni combo, io '

Un'idea che mi è venuta in mente per risolvere il secondo problema è quella di aggiungere e attribuire al COMPONENTE DEL PRODOTTO flaggin il prodotto principale per la combinazione (cioè hamburger). Quindi, quando si esegue il processo di determinazione dei prezzi, interrogare quali prodotti nell'ordine sono i prodotti principali in un "pacchetto", correlando la query allo sconto fornito dalla tabella PRICE COMPONENT e ordinando per quel valore (decrescente), e in quell'ordine di pacchetti verificare per vedere se è possibile creare un "pacchetto" con i restanti prodotti non principali con una query e ripetere il processo fino a quando non ci sono più prodotti principali o non ci sono più prodotti non principali nel resto.


Cosa hai fatto finora ? Mostraci qualche diagramma ER.
Tulains Córdova,

@ user61852 Faccio la maggior parte dei miei ERD a mano. Puoi consigliarmi uno strumento per eseguirli sul computer in modo che io possa condividerlo? (speriamo che sia gratuito :)
cml

@ user61852 Ho trovato gliffy.com che si sta rivelando piuttosto utile. Sto lavorando per mettere insieme quello su cui ho lavorato per aggiornare la mia domanda.
cml

@ user61852 Ho aggiunto l'aggiornamento n. 1 per mostrare ERD, diagramma di flusso, anticipazioni e dati della tabella di esempio.
cml

Risposte:


2

Questo potrebbe complicarsi ...

1) Come strutturare le tabelle in modo da creare i diversi pacchetti o promozioni in modo molto flessibile per aggiungere diversi tipi di promozioni con requisiti diversi?

È possibile iniziare con una packaged_withtabella per determinare quali prodotti possono essere raggruppati e confezionati insieme:

pacchetto
-------
  id (PK)
  nome

package_group
-------------
  package_id (da FK a package.id)
  nome

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

package_groupsi riferisce a package. packaged_withfa riferimento a productse package_groups, in modo che una riga in packaged_withmostri quali prodotti un prodotto può essere impacchettato e un pacchetto può essere composto da più gruppi.

I dati sarebbero così:

pacchetto
-------
ID | nome
------------
1 | Combo

package_group
------------
ID | nome
---------
1 | Gruppo QR
2 | Gruppo 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

Questo ti aiuterà con i pacchetti di prodotti stessi. Ho alcune idee per il resto della tua domanda, ma non ho tempo di finire questa risposta in questo momento ...


promozioni

Elencate molti tipi di promozioni. Potresti voler esaminare una sorta di motore delle regole, ma cercherò di semplificare le cose, ma comunque ... Questo diventerà complicato ..

Cominciamo con semplici promozioni in cui un prezzo è scontato di una certa percentuale:

percent_discount
----------------
  id (PK)
  nome
  percent_amount

product_promotions
------------------
  id (PK)
  product_id (da FK a product.id)
  promotion_id (da FK a percent_discount.id)
  data d'inizio
  data di fine

Qui abbiamo una tabella che memorizza la percentuale che ottieni per il prodotto. Un'altra tabella collega effettivamente i prodotti al tasso di sconto e include anche una data di inizio e di fine in modo da sapere se lo sconto è applicabile in una determinata data.

Idee per le altre promozioni in arrivo ...


Non vedo l'ora di leggere il resto della tua risposta quando avrai tempo di scriverla. Grazie per l'aiuto.
cml

Esaminerò sicuramente i "motori delle regole"! Se disponi di buoni collegamenti alle risorse, inviali a modo mio! Il mio problema più grande è sapere quali sono le promozioni applicabili a un elenco non ordinato e non raggruppato di articoli dell'ordine (Caso B).
cml

@cml: so che ci sono prodotti commerciali che probabilmente hanno già le capacità che desideri. Uno che conosco si chiama Hybris, ho sentito che ha un sistema di promozioni molto sofisticato.
FrustratedWithFormsDesigner

Ho aggiunto l'aggiornamento n. 1
cml

1

Sebbene sia un thread di 3 anni, sto ancora rispondendo pensando che potrebbe essere utile a qualcuno.

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

Per costruire un'offertaDettagli, è necessario fornire un obbligatorio, un mixgropu1 e amixGropu2. Quindi caseB, ha solo 2 offerte come segue:

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.

Altre offerte si basano sulla logica aziendale: Per lo sconto sull'offerta in quantità: creare una query per trovare il conteggio di B in un'offerta per un cliente. chiamiamolo QTYB. trova QTYB% 2 e moltiplicalo per quantitàOfferta valore (che è $ 20)

Per l'offerta di statistiche, basta aggiungere un altro bit chiamato earnPoint per l'acquisto di un cliente. e imposta il punto guadagnato una data di scadenza. il punto guadagnato può essere uguale all'importo acquistato. Controlla se l'importo acquistato> = $ X, emettono uno sconto secondo la politica.

Simile è il confronto dei tempi dell'ordine se è prima delle 17:00 e dopo le 10:00 quindi emette il 5%, altrimenti emette uno sconto del 10%.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.