Schema del database per i prezzi dei prodotti (pacchetti, promozioni, basati su quantità, offerta limitata nel tempo ...)

10

Sto lavorando a un nuovo punto vendita per un'azienda che produce prodotti a 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

L'azienda ha pacchetti, ad esempio Pacchetto "Combo": per il prodotto A o B, se scegli 1 di Q o R e 1 di X, Y o Z ottieni uno sconto di $ 20.

Caso A: a volte i clienti aggiungono a un prodotto di base quando effettuano un ordine, ad esempio: Non sono uno dei prodotti 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 desiderano 1 prodotto B con 1 R e 1 Z.

Caso B: A volte i clienti aggiungono 1 A e 2 B, 2 Q, 1 S, 2 X e 1 Z. Secondo le regole stabilite dal pacchetto "Combo", solo 2 combo si applica perché S non è un elemento combo.

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% di sconto se prima delle 10.00. Un'altra promozione potrebbe dipendere dal momento in cui si è verificato l'ultimo acquisto o se hai acquistato più di $ X in Y timeframe.

I miei problemi:

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

2) Quando ordinano come Case B (o un mix di Case A e Case B) come faccio a strutturare la mia query in modo che possa provare per vedere quali mix di prodotti sono nell'ordine, e aggiornare i prezzi / descrizioni di conseguenza? In definitiva, il risultato migliore per questa query restituirebbe quali pacchetti e promozioni soddisfano i requisiti in base ai quali offre il massimo beneficio al cliente (ad esempio, forse ciò che ha ordinato soddisfa i requisiti delle promozioni 1 e 3, ma la promozione 3 è meno costosa. deve funzionare con più promozioni).

Grazie in anticipo per l'aiuto!

UPDATE # 1

Per descrivere meglio i problemi in corso e aggiornare il lavoro svolto finora per risolverli Includo un ERD del modello di prodotto limitato alle entità e agli attributi che influiscono sul problema (cioè l'inventario non è in gioco qui, quindi non sono presenti entità di inventario).

Stoancheincludendoidatidiesempiodelleentitàedegliattributicheinfluisconosuquestadomanda(persemplificarelaletturadeidati,inseriscoilnome/ledescrizionialpostodellechiaviesterne):

Ecco un link a un diagramma di flusso che fornisce un esempio di una combo, un veloce e visivo modo per capire 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 community fino a quando non sono stato informato, sono stato in grado di risolvere il Problema n. 1. In effetti, l'ho fatto con più flessibilità di quanto pensassi di poter fare nella prima distribuzione del sistema.

Tutti se ci sono stati progressi con il Problema 2, non è stato risolto con soddisfazione. Ci sono state alcune idee su come fare questo, Neil McGuilgan ha posto una grande domanda che porta a una possibile soluzione utilizzando la divisione relazionale (dba.stackexchange.com/questions/45829/che-è-il-nome-di-questo-- 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, a quanto ho capito, funziona solo con "uno" record (combo) alla volta. Se un cliente cammina e dice che vuole 2 cheeseburger, 1 hamburger, 1 piccolo succo di mela, 1 coke, 1 patatine fritte e 2 anelli di cipolla, ho bisogno di un modo per rilevare che nel mix c'è solo una combo e aggiungere l'altro prodotti a prezzo base. Se ci sono più combinazioni combo, sto cercando (idealmente per una query sql) in grado di dare la priorità alle combinazioni combo con risparmi maggiori.

Un'idea che ho trovato per risolvere il problema due è quella di aggiungere e attribuire a PRODUCT COMPONENT flaggin il prodotto principale per la combo (cioè hamburger). Quindi, quando si esegue il processo di determinazione del prezzo, interrogare quali prodotti nell'ordine sono prodotti principali in un "pacchetto", correlando la query allo sconto dato dalla tabella PREZZO COMPONENTE e ordinando in base a tale valore (in ordine decrescente) e in tale ordine di controllo dei pacchi per vedere se è possibile creare un "pacchetto" con i restanti prodotti non principali con una query e ripetere il processo finché non ci sono più prodotti principali o non ci sono altri prodotti non principali nel resto.

    
posta cml 04.07.2013 - 23:07
fonte

2 risposte

2

Questo potrebbe complicarsi ...

1) How do I structure the tables so I my create the different packages or promotions in a way that is very flexible to add different types of promotions with different requirements?

Potresti iniziare con una tabella packaged_with per determinare quali prodotti possono essere raggruppati e raggruppati insieme:

package
-------
  id (PK)
  name

package_group
-------------
  package_id (FK to package.id)
  name

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

package_group si riferisce a package . packaged_with si riferisce a products e package_groups , quindi una riga in packaged_with mostra quali prodotti un prodotto può essere confezionato e un pacchetto può essere costituito da più gruppi.

I dati sarebbero simili a questo:

package
-------
ID  |  name
------------
1   |  Combo

package_group
------------
ID | name
---------
1  | QR group
2  | XYZ group

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 del prodotto stessi. Ho alcune idee per il resto della tua domanda, ma non ho tempo di finire questa risposta adesso ...

Promozioni

Elenchi molti tipi di promozioni. Potresti voler esaminare una sorta di motore delle regole, ma cercherò di mantenere le cose più semplici di così, ma comunque ... Questo sarà complicato ..

Iniziamo con semplici promozioni in cui il prezzo è scontato di una certa percentuale:

percent_discount
----------------
  id (PK)
  name
  percent_amount

product_promotions
------------------
  id (PK)
  product_id (FK to product.id)
  promotion_id (FK to percent_discount.id)
  start_date
  end_date

Qui abbiamo una tabella che memorizza la percentuale di sconto per 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 qualsiasi data specifica.

Idee per le altre promozioni in arrivo ...

    
risposta data 04.07.2013 - 23:37
fonte
1

Anche se è 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, devi 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 offerta quantità:  creare una query per trovare il conteggio di B in un'offerta per un cliente. chiamiamolo QTYB. trova QTYB% 2 e moltiplicalo con quantityOffer value (che è $ 20)

Per l'offerta di statistiche, aggiungi un altro bit chiamato earnPoint per l'acquisto di un cliente. e impostare il earnPoint su una data di scadenza. il punto guadagnato può essere uguale all'importo acquistato. Verifica se la quantità acquistata > = $ X, emettono lo sconto come da criterio.

Simile è il confronto del tempo dell'ordine se è precedente alle 17:00 e dopo le 10:00 quindi emette il 5% di sconto sul 10%.

    
risposta data 29.06.2016 - 06:39
fonte