Nous commençons à concevoir les blocs de construction d'un magasin de données / entrepôt et nous devons être en mesure de prendre en charge tous les fuseaux horaires (nos clients viennent du monde entier). De la lecture des discussions en ligne (et dans les livres), une solution courante semble être d'avoir une dimension de date et d'heure distincte ainsi qu'un horodatage dans les tables de faits.
Cependant, la question à laquelle j'ai du mal à répondre est de savoir à quoi me servent réellement les dimensions de date et d'heure compte tenu de mes exigences de fuseau horaire dynamique. Une dimension de temps a un peu plus de sens mais j'ai du mal avec la dimension de date. Une approche de conception générale pour une dimension de date comprend généralement des propriétés telles que le nom du jour, le jour de la semaine, le nom du mois, etc. Le problème que j'ai avec tout cela est que 23h00 le mardi 31 décembre 2013 à UTC est mercredi , 1er janvier 2014 dans tous les fuseaux horaires postérieurs à UTC + 2.
Donc, si je dois faire toutes ces conversions de fuseau horaire sur chaque requête (et rapport), quel est l'intérêt d'avoir et de stocker ces propriétés que je n'utiliserai probablement jamais (semble-t-il)? Certaines personnes suggèrent d'avoir des lignes de faits pour chaque fuseau horaire, mais cela me semble ridicule. Nous devons être en mesure de stocker des millions d'enregistrements chaque mois.
D'autres suggèrent d'avoir une table de pont de fuseau horaire qui, bien que logique, semble également être une complexité supplémentaire et des jointures supplémentaires pour accomplir quelque chose que mes applications et rapports clients devraient facilement être en mesure de comprendre à partir d'une date (les rapports seront principalement basés sur le Web où il existe une myriade de bibliothèques pour aider à la conversion, l'affichage et le formatage des dates).
La seule chose à laquelle je peux penser est la facilité et éventuellement les performances du regroupement par date et heure, mais à quel point une pratique est mauvaise de regrouper par partie de date (nous utilisons MS SQL mais nous interrogerons des millions de lignes) ou devrions-nous envisager juste des dimensions de date et d'heure extrêmement simples avec pas beaucoup plus que les nombres d'heure, de jour, de mois et d'année, car la plupart des littéraux tels que lundi ne signifieraient pas grand-chose lorsque les fuseaux horaires entrent en jeu?
la source
Réponses:
D'abord...
La séparation
Datime/Time
en uneDate
dimension et uneTime
dimension est définitivement la voie à suivre.Pour gérer plusieurs fuseaux horaires, vous devez dupliquer le
DateKey
et leTimeKey
afin d'avoir les éléments suivants:LocalDateKey
LocalTimeKey
UtcDateKey
UtcTimeKey
Vous dites...
En ayant les 4 colonnes que j'ai énumérées ci-dessus, vous pourrez joindre la table de faits à la dimension Date et / ou Heure à l' aide des alias de table (dans la terminologie Kimball, ces tables de dimensions aliasées sont appelées "Dimensions de jeu de rôle"), donc vous auriez quelque chose comme ceci:
En terminant ...
Comme vous créez un magasin de données et non une base de données OLTP, la génération des heures locales et utc doit être effectuée dans votre ETL , PAS dans les applications côté client pour les raisons suivantes (à l'exception de la localisation de l'heure UTC dans point de vue du lecteur de rapport):
StandardisedDateKey
, ouCorporateHQDateKey
, au lieu d'un tableau de dates UTC, vous standardisez en fonction d'une autre norme convenue par l'entreprisela source
Date
etTime
au lieu d'une seuleDateTime
? Une table de faits peut avoir plusieurs dates, et le stockage de deux INT au lieu d'un pour chacun peut s'additionner.Je m'excuse à l'avance pour la brièveté de cette réponse et je prévois de préciser quand je ne suis pas au travail.
Il y a très certainement des avantages à avoir des tables de date et d'heure car elles permettent une agrégation facile de vos données. Dans de nombreux cas, c'est le moyen le plus simple de trier par mois ou jours ouvrables des choses de cette nature. Cependant, cela ne remplace pas nécessairement l'utilité d'un horodatage. Dans votre cas particulier, un horodatage UTC. Une fois que vous avez cet horodatage, tout ce que vous avez à faire est de le changer en heure locale dans la couche de rapport ou de présentation. Afin d'éviter les analyses de plage, assurez-vous de convertir également votre plage de demandes en heure UTC.
Si vous avez d'autres questions ou commentaires, n'hésitez pas à demander.
la source