Tabella dei prezzi di progettazione (agnostico RDBMS)

1

Sto progettando una tabella di listino prezzi per il mio database.

Comprenderà Cliente, Modello, Data di avvio, Data fine, Prezzo, Valuta, PVR

Quando aggiorno un nuovo listino prezzi, che viene inviato di tanto in tanto (forse ogni 1 ~ 3 mesi), devo aggiornare i prezzi, ma vorrei conservare i registri di ciò che è già stato sollevato.

Attualmente nel sistema:

Customer  - Model - Start Date - End date  - Price - Currency - RRP
A         - Z     - 2015/10/20 - 2015-12-19- 120   - GBP      - 220
A         - Z     - 2015/12/20 - 2999-12-31- 100   - GBP      - 200

Dopo aver aggiornato il nuovo prezzo:

Customer  - Model - Start Date - End date  - Price - Currency - RRP
A         - Z     - 2015/10/20 - 2015-12-19- 120   - GBP      - 220
A         - Z     - 2015/12/20 - 2016-02-20- 100   - GBP      - 200
A         - Z     - 2016/02/21 - 2999-12-31-  90   - GBP      - 180

Qual è il modo migliore per aggiornare il prezzo?

Ho provato a google che ha risolto tutti i problemi fino ad ora poiché la maggior parte dei risultati della ricerca sta facendo emergere piani tariffari SQL: (

Ho imparato MySQL 9 anni fa al college per alcuni mesi, quindi so come interpretare gli script SQL ma sono totalmente perso quando cerco di creare qualcosa da zero.

    
posta Hyungsup Kim 12.01.2016 - 20:48
fonte

5 risposte

1

Ho due commenti sul tuo progetto:

  1. Come si stampa un intero listino prezzi composto da diversi prodotti? Prendi in considerazione tutte le righe con lo stesso cliente e la stessa data di inizio e fine di un singolo listino prezzi? O semplicemente non hai listini prezzi e invece hai prezzi separati per prodotti diversi senza raggrupparli in listini?
  2. Devi inserire NULL nella colonna della data di fine anziché in una data fittizia.

Suggerisco qualcosa del genere:

Potresti avere un listino prezzi generale e listini prezzi speciali per clienti speciali.

    
risposta data 12.07.2016 - 21:49
fonte
0

Il tuo schema sembra corretto.

Per chiarire la confusione che alcuni altri commentatori hanno:

Elenco dei prezzi correnti: -

select * from tbl where End_Date = '2999-12-31'

Prezzi a fine anno 2016: -

select * from tbl where Start_Date >= '2016-12-31' and End_Date =< '2016-21-31'

Gli aggiornamenti sono semplici sql. INSERISCI la nuova riga quindi AGGIORNA l'End_Date nella vecchia riga, come singola transazione.

    
risposta data 08.08.2017 - 06:40
fonte
0

Invece di utilizzare sia Start_Date che End_Date , potresti considerare una singola colonna Effective_From . In questo modo otterrai lo stesso risultato, ma l'inserimento di un nuovo prezzo richiede semplicemente l'aggiunta di una nuova riga, senza aggiornare nessuno dei precedenti.

La selezione delle date attuali e storiche richiederebbe una sottoquery, quindi:

select * from tbl where Effective_From = (select max(Effective_From) from tbl where Effective_From <= '2017-11-06')

È un compromesso per l'utilizzo di inserti pesanti. Ma penso che con l'indice su% non nullable Effective_From renderebbe abbastanza selettivi.

    
risposta data 06.11.2017 - 07:49
fonte
-1

Non c'è niente di sbagliato nel modo in cui lo fai, tuttavia c'è anche un modo alternativo, usando le versioni, il tavolo potrebbe assomigliare a questo

Customer  - Model -Version - Price - Currency - RRP
A         - Z     -1       - 120   - GBP      - 220
A         - Z     -2       - 100   - GBP      - 200
A         - Z     -3       -  90   - GBP      - 180

La versione può essere usata per collegare i tuoi record ad altre tabelle correlate, e ti darebbe una migliore relazione senza elaborare le date per trovare il prezzo per un dato ordine.

    
risposta data 13.01.2016 - 07:15
fonte
-1

Come selezioneresti il record più recente? Ti piace questo?

select *
from tbl
where StartDate = (select max(StartDate) from tbl)

È un po 'macchinoso e sembra inefficiente anche se non l'ho provato.

Considera di avere una colonna booleana isMostRecent . Questa colonna è 0 per tutti i record tranne il record più recente. In questo modo, ecco come selezionare il record più recente:

select *
from tbl
where isMostRecent = 1

Per influire su questo, avrai bisogno di una procedura di inserimento in due fasi (con una transazione):

update tbl set isMostRecent = 0 where isMostRecent = 1
insert into tbl (..., isMostRecent) values (..., 1)

Con questo approccio, stai memorizzando i campi calcolati. Ecco alcune discussioni sui pro e contro della memorizzazione dei campi calcolati. Con un indice su isMostRecent, questo potrebbe accelerare le prestazioni. Dipende da come stai usando questa tabella.

Modifica: questo non ti impedisce di avere colonne StartDate e EndDate. Probabilmente vorrai comunque una colonna StartDate almeno così puoi guardare indietro nel tempo.

    
risposta data 11.07.2016 - 21:38
fonte

Leggi altre domande sui tag