vendredi 19 novembre 2010

Premier article : Modélisation d'une dimension temps

Pour mon premier article, je souhaite parler d'un sujet qui va paraître évident à tout le monde et qui est la première pierre de tout système décisionnel : la dimension Temps


Pourquoi m'attarder dessus ? Tout simplement car je remarque très souvent chez mes clients que les choses les plus évidentes ne le sont pas forcément pour tout le monde.


Je parlerai essentiellement de deux choses :

  • La clé primaire de cette dimension
  • Le numéros de semaine et les années qui y sont rattachées

Clé primaire d'une dimension Temps :

On nous apprend très tôt que toute dimension d'un datawarehouse doit être un entier auto-incrémenté, et beaucoup l'applique également au temps.
Je préconise plutôt un entier de la forme YYYYMMDD (par exemple 20101119) comme clé primaire.
Ceci pour deux avantages :
  • Une requête sur les tables de faits ne nécessitent pas de jointures sur la dimension Temps car la date est stockée en clair.
  • Dans le cas d'une forte volumétrie qui vous impose de partitionner votre base de données relationnelle, votre fonction de partitionnement aura une valeur fonctionnelle : c'est-à-dire que vous définirez les plages de votre fonctions entre deux dates.

Numéros de semaine et année de la semaine :

Sauf besoin spécifique de votre client, celui-ci attend comme numéro de semaine, le numéro ISO de la semaine, car il s'agit de celui qui permet de comparer une semaine d'une année à l'autre.
Je vous donne le lien vers la définition de Wikipedia, mais pour faire simple, la première semaine d'une année est celle qui contient le premier jeudi de l'année.

SQL Server 2008 a introduit dans sa fonction datepart le mot-clé isowk, c'est pourquoi vous pouvez définir votre numéro de semaine directement à la création de votre table de dimension en créant une colonne calculée DATEPART(isowk,date).

Cette définition implique qu'une date n'est pas forcément rattachée à son année civile (par exemple le 1er janvier 2006 est rattaché à la semaine 52 de l'année 2005). Il faut donc ajouter une colonne année de la semaine dans notre table.
Celle-ci peut être aussi ajoutée grâce à une colonne calculée :
DATEPART(year,DATEADD(d,-(DATEPART(weekday,date)+5) % 7+3,date))
(plus de détails sur le calcul ici)


to be continued...

1 commentaire:

  1. Cher Monsieur Joubert,

    Votre script ne marche pas avec le premier jour de la semaine au Dimanche (réglage des dates à l'américaine au niveau SQL).

    Heureusement, vous êtes intervenu sur notre serveur et nous avez sauvé avec:
    set datefirst 7

    Merci!

    RépondreSupprimer