Sto progettando un data warehouse per una piattaforma di vendita. Esiste un gruppo di utenti che offre e un gruppo di utenti che richiedono entità.
Il database di produzione contiene due fonti di informazioni:
- Lo stato corrente di ciascuna entità e a quali utenti è assegnato (questo può essere versatile, "posto un prezzo per un ordine", "comprato", "offerto"). Questo può quindi coinvolgere più utenti a seconda dello stato.
- Un registro di azioni
Di conseguenza, ci sono due tipi di domande che possono essere richieste al data warehouse. Per esempio:.
- Quante offerte sono state senza un ordine ieri alle 9 del mattino? (Stato)
- Quante entità sono state vendute ieri? (Azione)
Il mio obiettivo è un semplice schema a stella in cui le dimensioni possano essere tempo, luogo, utenti, ecc. Ma la domanda è: quale sarebbe il fatto?
Primo approccio
La mia prima idea era di introdurre una tabella dei fatti per ogni stato. Quindi ogni fatto avrebbe bisogno di una validità iniziale e finale e non appena il registro delle azioni dice che uno stato è cambiato, ho bisogno di tornare alla tabella dei fatti in cui è memorizzato lo stato corrente dell'entità e aggiungere il timestamp di validità finale e successivamente aggiungi il nuovo fatto nella tabella del nuovo stato dell'entità (con un timestamp di fine validità mancante).
Con questo approccio, è molto semplice rispondere alla domanda 1 (Stato) ma impossibile rispondere alla domanda 2 (Azione). Inoltre, sembra non banale aggiornare il data warehouse su ogni azione.
Secondo approccio
Un'idea alternativa era semplicemente di archiviare il registro delle azioni in un modo schematizzato a stella. Ogni tipo di azione diventa un fatto. (Naturalmente, la domanda 2 (Azione) è la risposta più semplice, ma per quanto riguarda la domanda 1 (Stato)?
La mia idea era di creare viste parametrate per data per ogni stato: Ad esempio, per ottenere tutte le offerte senza un ordine alle 9 del mattino, dovrei ottenere tutte le azioni che dicono "offerto qualcosa" da ieri alle 9:00 e dovrei sottrarre tutte le offerte che
- un ordine è stato inserito su
- che sono stati cancellati fino alle 9 di mattina
Suppongo che l'efficienza temporale con questa soluzione potrebbe non essere ottimale per la lettura. Sebbene pensassi che i data warehouse mirano a scambiare l'efficienza di scrittura per l'efficienza di lettura.
Quindi la mia domanda : come progettare la tabella dei fatti per essere in grado di rispondere a entrambe le domande precedenti con il minimo della complessità?