Domanda

Ho una dimensione (SiteItem) ha due fatti importanti:

perUserClicks 
perBrowserClicks

Tuttavia, all'interno di questa dimensione, ho gruppi di valori basati su una colonna di attributi (chiamiamolo i gruppi AboveFoldItems, LeftNavItems, OnTheFlyItems, etc.) hanno ciascuna più fatti che sono specifici per quel gruppo:

AboveFoldItems: eyeTime, loadTime
LeftNavItems: mouseOverTime
OnTheFlyItems: doesn't have any extra, but may in the future

è la seguente tabella dello schema fatto ok?

DateKey   
SessionKey
SiteItemKey
perUserClicks 
perBrowserClicks
eyeTime
loadTime
mouseOverTime

Sembra un po 'uno spreco poiché solo alcune colonne si riferiscono ad alcune chiavi della dimensione (i fatti irrilevanti sono lasciati NULL). Ma ... questo sembra come sarebbe un problema comune, quindi non ci dovrebbe essere una soluzione comune per questo, giusto?

È stato utile?

Soluzione

Sono in generale d'accordo con la risposta di Damir su questo, ma perché la tabella dei fatti è molto stretta nel vostro caso particolare, non v'è ancora merito di esaltazione di Aaron per mantenere i NULL.

Abbiamo diversi schemi stelle a settori particolari con più tabelle dei fatti che condividono la maggior parte (se non tutti) delle dimensioni (conformato e interna). Le dimensioni limitate-campo di applicazione non sono considerati "conformi" in tutta l'azienda, ma sono quello che noi chiameremmo dimensioni "condivise interni".

Ora in genere, se i dati vengono caricati contemporaneamente in modo che la dimensione non è cambiata, è possibile partecipare a entrambe le tabelle dei fatti sui tasti, ma in generale, naturalmente, non è possibile unire due differenti schemi a stella sui tasti di dimensione se sono surrogati in tradizionali dimensioni lentamente cambiando. In generale, è necessario unire stelle separati sui tasti naturali o "delle chiavi di business" all'interno della dimensione e non su surrogati (ad eccezione di solito nel caso particolare della dimensione data in cui è immutabile ed ha solo una chiave naturale).

Si noti che quando si uniscono le due stelle, è necessario utilizzare un LEFT JOIN, nel qual caso si produrrà NULL che sarà ancora probabilmente dovranno tener conto delle - così si sta effettivamente tornare al modello originale hai avuto con i NULL! ; -)

Il vantaggio della tabella dei fatti in più è più evidente quando le tabelle sono ampie con un insieme ridotto di chiavi e il partizionamento verticale dei dati produce risparmio di spazio, nonché un modello più pulito logica - questo è particolarmente vero quando i tasti sono veramente solo da condividere fino a un certo punto - vista una chiave chiave o NULL fittizio non è sicuramente una buona idea -. questo di solito indica un problema di modellazione tridimensionale

Tuttavia, come dice Aaron, se viene spinto agli estremi, si può avere una colonna fatto singolo in ogni tabella dei fatti con le chiavi condivise, il che significa che l'overhead chiave nani il costo fatto e davvero non finire in un'EAV mascherata modello.

Vorrei anche guardare per vedere se si è nella situazione di Kimball di "troppo pochi dimensioni". Sembra che si deve avere buone caratteristiche dimensionali concentrati nella SessionKey e SiteItemKey - ma senza vedere l'intero modello ed i requisiti, è difficile da dire, ma io penserebbe si avrebbe alcuni dati demografici degli utenti in una low-cardinalità o dimensione ancora fiocco di neve senza la pieno di sessione o un sito dimensione.

Altri suggerimenti

Non è una soluzione elegante davvero, hai i colonne nullable o si utilizza una soluzione EAV. Ho postato su EAV prima (e ha generato un sacco di commenti che potrebbe essere utile la lettura):

Io sono un fan di quel modello in alcuni scenari, ma se le dimensioni / attributi non cambiano di frequente, può essere un sacco di lavoro extra per niente. i valori NULL in una colonna in realtà non fanno i rifiuti fino a quando il codice circostante può trattare con loro in modo appropriato.

Si potrebbe avere più di una tabella dei fatti: factperUserClicks, factperBroWserClicks, factEyeTime, ecc ...

Ognuno di questi avrebbe DateKey, SessionKey, SiteItemKey. In questo modo solo i tasti di dimensione che "hanno senso" appaiono con ogni realtà.

In teoria, non ci dovrebbero essere NULLS nel DW - se tenerli nella stessa tabella dei fatti, utilizzando zeri può essere più appropriato

.

Per quanto riguarda il risparmio di spazio su disco, non vedo una soluzione ideale - ma, in uno DW dovrebbe scambiare lo spazio per la velocità e (query) semplicità in ogni caso

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top