La mia comprensione della granularità della tabella dei fatti è corretta?


8

Io e un altro DBA della nostra azienda abbiamo il compito di rivedere un progetto di database che un fornitore ha sviluppato per noi. Il venditore ha dichiarato di utilizzare Kimball come base per il loro design. (NOTA: non sto cercando argomenti su Kimball vs Inmon, ecc.) Hanno progettato un mart con più fatti e dimensioni.

Ora in tutta onestà, la nostra azienda non ha mai progettato un singolo mart. Abbiamo sempre avuto i consulenti a farlo. E non siamo mai stati inviati a lezioni o altro. Quindi la nostra conoscenza del magazzinaggio / marts / modellazione dimensionale, ecc. Si basa su quella poca esperienza che abbiamo, ciò che possiamo trovare su Internet e l'auto-lettura (abbiamo i libri di Inmon e Kimball e stiamo cercando di farcela) .

Ora che il palcoscenico è pronto per il mio livello di conoscenza, arriviamo alla sfida del design.

Esiste una tabella dei fatti chiamata "Statistica delle perdite sinistri" (questo è per le assicurazioni). E stanno provando a catturare sia i pagamenti per i sinistri (arrotolati a un livello mensile), sia i soldi nelle riserve (un po 'come un conto bancario per i sinistri). Vogliono vedere gli importi mensili per i pagamenti (no biggie). Ma desiderano vedere il saldo corrente del conto delle riserve.

Farò un esempio pittorico.

Supponiamo di aver impostato $ 1000 USD in riserve per un reclamo. Questo viene messo da parte (quindi per alcuni aspetti funziona come un conto bancario).

Nell'ottobre 2014 non paghiamo ancora nulla. Quindi l'azienda vuole vedere i pagamenti e il saldo di riserva alla fine di ottobre.

-----------------------------------------------
-  MONTH_YEAR  -  PAYMENTS -  RESERVE_BALANCE -
-----------------------------------------------
-      102014  -      0.00 -          1000.00 -
-----------------------------------------------

Quindi arriva novembre. Effettuiamo pagamenti di $ 100, $ 150 e $ 75 dollari. Vogliono vedere tali importi aggregati e la riserva al saldo come segue:

-----------------------------------------------
-  MONTH_YEAR  -  PAYMENTS -  RESERVE_BALANCE -
-----------------------------------------------
-      102014  -      0.00 -          1000.00 -
-----------------------------------------------
-      112014  -    325.00 -           675.00 -
-----------------------------------------------

E poi diciamo che abbiamo zero pagamenti a dicembre e poi $ 200 in più a gennaio del prossimo anno.

-----------------------------------------------
-  MONTH_YEAR  -  PAYMENTS -  RESERVE_BALANCE -
-----------------------------------------------
-      102014  -      0.00 -          1000.00 -
-----------------------------------------------
-      112014  -    325.00 -           675.00 -
-----------------------------------------------
-      122014  -      0.00 -           675.00 -
-----------------------------------------------
-       12015  -    200.00 -           475.00 -
-----------------------------------------------

Qui è dove faccio fatica. La mia comprensione è che la parte dei pagamenti è corretta. Sono tutti raggruppati a livello mensile all'interno di ciascun record. Quindi puoi eseguire il rollup ulteriormente se lo desideri per l'anno, il trimestre, ecc.

Ma l'importo delle riserve è diverso. È un equilibrio. E l'azienda vuole vedere quanto c'è in saldo ogni mese. Ma non puoi aggregare in questo campo. Se lo facessi, otterrai alcuni risultati traballanti.

In qualche modo questo mi sembra sbagliato. Ma non posso sinceramente dire che ho modellato abbastanza o ne so abbastanza. Tutto quello che posso dire è quello che so. E da quello che so, tutti i valori di un Fatto dovrebbero essere alla stessa granularità.

Entrambi i numeri sono alla stessa granularità di un "mese", ma non sono dal punto di vista di ciò che rappresentano. Uno è dollari aggregati entro un mese. L'altro è solo l'equilibrio.

È corretto? Ho respinto questo progetto. Sbaglio a farlo? Va bene farlo in un dato di fatto? O il mio senso di "odore di codice" di un cattivo design è accurato?

Qualsiasi aiuto sarebbe apprezzato. NOTA: per favore non solo dire "Dovrebbe essere il modo X", per favore spiega perché dovrebbe essere così in modo che io possa imparare da questo.

EDIT : Beh, ho imparato che la mia comprensione iniziale del Fatto è sbagliata. La granularità NON è mensile. La granularità è a livello di transazione. Ciò significa che entro il MONTH_YEAR (ovvero in realtà è il periodo di rendicontazione finanziaria) ci saranno più operazioni di pagamento e recupero. Questi saranno registrati per data o data della transazione. Ma a causa di un precedente rapporto che l'azienda vede, e anche a causa di come i dati sono archiviati nel sistema legacy da cui provengono, volevano mettere sia i dati transazionali (una riga per) sia il saldo mensile di riserva (una riga al mese ).

Una volta appreso ciò, mi rendo conto che il problema non era tanto additivo contro non additivo, né semi-additivo quanto lo era il grano, che era ciò che sospettavo dall'inizio. Il nostro team DBA ha discusso di questo con il team del progetto e ha riferito che stanno tentando di mettere due grani diversi nello stesso fatto, e questo non era corretto. Il fatto che dovrebbero o aumentare le transazioni a un livello mensile, consentendo loro di avere i pagamenti, i recuperi e il saldo delle riserve mensili (cioè un fatto semi-additivo) perché tutto sarebbe a grano mensile. Oppure devono trovare un modo per scomporre il saldo di riserva in transazioni per preservare il livello di transazione. Oppure devono dividere il fatto in due fatti. Uno può essere il livello mensile per il saldo di riserva. L'altro può essere a livello di transazione per pagamenti e recuperi. (Non vi è alcun motivo per cui anche loro non possano mettere i pagamenti e i recuperi a livello mensile nella realtà a livello mensile. Dipende solo dalle esigenze aziendali.)

Dato quello che ho imparato, segnerò la risposta di Thomas come quella corretta. Tuttavia, ritengo che la discussione che ho iniziato con la domanda originale sia ancora valida per gli altri, quindi lascerò intatta la parte originale della mia domanda. Intendo anche assegnare una generosità alla risposta di Nikadam, poiché ciò mi ha insegnato molto sui fatti additivi, non additivi e semi-additivi e ha corretto molti fraintendimenti che ho avuto sulla modellazione dimensionale.

Risposte:


5

La tua intuizione di odore di codice è ben affinata.

Quello di cui hai a che fare reserves è quello che Kimball chiama un "fatto semi-additivo". Non si arrotola bene per un quarto o anno.

La soluzione tipica è avere due tabelle dei fatti, una per il fatto additivo ( paymentsnel tuo caso) e una per il fatto non additivo. Il fatto non additivo in realtà non ha bisogno di avere un grano a livello di mese, potresti conservarli fino al giorno e le cose continuano a funzionare.

Il fatto non additivo reserveviene interrogato diversamente dall'altro fatto. C'è una decisione aziendale che devi prendere: cosa significa reservea livello annuale? È l'ultimo mese dell'anno o forse la media dei mesi dell'anno? Qualunque sia la tua scelta, puoi trovare la soluzione per modellarla nei libri di Kimball sotto i capitoli sui fatti non additivi.

Si noti che se si utilizza un prodotto cubo come Analysis Services, è possibile che gli aggregati "funzionino" anche se lo si memorizza in un'unica tabella. Tuttavia, preferisco tenere le cose separate in modo che le query relazionali siano più facili da scrivere (e anche i fatti siano più facili da caricare).


Quindi stai proponendo che i due valori siano suddivisi in due fatti, uno additivo e uno non additivo? (Questo è in realtà ciò a cui mi stavo sporgendo.) Anche così, puoi fornire una ragione per questo? Kimball dice addirittura di non mescolare valori additivi e non additivi in ​​un dato di fatto?
Chris Aldrich,

4
In alternativa, potresti trasformare il tuo fatto non additivo reserve, in un fatto additivo payment into reserve, che sarà allo stesso livello di granularità payment out of reserveche hai ora.
Mustaccio,

@ChrisAldrich: considera la query in cui desideri combinare la SOMMA di pagamento per un anno e il valore di Riserva per lo stesso anno. Se entrambi i fatti fossero combinati nella stessa tabella, si otterrebbero alcune brutte query su finestre. Se hai le due misure in tabelle separate, la query è banale da scrivere.
Thomas Kejser,

7

Hai ragione: " grani diversi non devono essere mescolati nella stessa tabella dei fatti ".

Ma il saldo di riserva alla fine del mese e la somma dei pagamenti alla fine del mese sono allo stesso grano. È solo uno dei fatti semi-additivo . Il tipo di fatto (additivo o no) non definisce la grana della tabella.

Da quello che stai descrivendo, vedo il tuo grano come "istantanea del reclamo mensile", che rende la tua tabella dei fatti " Tabella dei fatti dell'istantanea periodica ".

In questo articolo Kimball ha un esempio di fatti additivi e semi-additivi nella stessa tabella dei fatti.

Ecco un esempio di istantanea periodica con fatti semi-additivi da The Data Warehouse Toolkit (pagina 116):

The Data Warehouse Toolkit di Kimball, pagina 116

La migliore pratica è disporre di una tabella dei fatti transazionali che rifletta ogni variazione della riserva (pagamenti e aggiustamenti) al livello atomico più basso. Quando si trattano i sinistri, spesso il livello atomico non è reclamo ma sub-reclamo (la propria compagnia assicurativa potrebbe avere il suo termine). Generalmente ogni sub-reclamo rappresenterà una parte diversa del reclamo e pagamenti / riserve per ciascuna parte. Ad esempio, potrebbero non esserci pagamenti all'assicurato, ma pagamenti a persone non assicurate dalla persona ferita dell'azienda e pagamenti all'ospedale e al procuratore.

A seconda delle prestazioni dello strumento di BI, è possibile utilizzare direttamente la tabella dei fatti transazionali per ottenere pagamenti e saldi mensili. In alternativa, è possibile aggiornare la tabella dei fatti dell'istantanea periodica dal quotidiano transazionale o alla fine del mese.

La capacità di gestire i fatti semi-additivi dipenderà dal livello di BI che si sta utilizzando. Alcuni strumenti in grado di gestire facilmente fatti semi-additivi e altri no.

Il libro principale di Kimball ( The Data Warehouse Toolkit ) ha il capitolo completo (16) sull'assicurazione.

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.