Bonjour.

J'utilise Cognos Impromptu 7 pour attaquer un Infocentre qui contient énormément de données historiques.
Plus précisément, j'ai une table PERSONNE liées (entre autres) aux tables UNION (pour les mariages), CARRIERE (évolution dans la carrière), ADRESSE, etc.
Chacune de ces tables contient une Date_effet et une Date_fin qui déterminent les périodes de validité des occurences.
Ces tables sont toutes liées à la table PERSONNE, mais pas entre elles.

Avec cette modélisation et l'utilisation qui en est faite, je me heurte à 3 problèmes.
1) il n'y a aucune contraintes d'intégrité entre ces tables. Autrement dit, lorsque je fais une sélection dans plusieurs de ces tables en même temps, ça donne lieu à un produit cartésien : pour chaque personne, toutes les unions seront croisées avec toutes les adresses, etc., même si les périodes ne correspondent pas. Les résultats sont donc en partis inconsistents.

2) Toutes ces tables ne contiennent pas forcément d'occurence "en vigueur" pour une période et une personne donnée. Or dans la plupart des requêtes, les infos sont "facultatives" : par exemple, je veux connaître la carrière d'une personne, même s'il n'est pas marié (donc pas d'occurence dans UNION). Toutes les jointures dans mon catalogue doivent donc être externes.

3) La plupart des requêtes ne font appel qu'à 2 ou 3 de ces tables.

- Dans un 1er temps, j'ai pensé créer un filtre dans le catalogue qui teste les périodes des occurences. Sauf que ça ralentit grandement les performances. D'autant que faire un test des périodes des 15 tables pour une requête qui ne fait appelle qu'à 2 d'entre elles, c'est dommage...

- J'ai ensuite créé une table PERIODE. Je ne peux évidemment pas relier chacune des tables à cette dernière, vu qu'Impromptu gère "aléatoirement" les boucles dans le graphe de jointure. Donc j'ai "forcé" ces jointures en mettant un filtre qui teste les périodes sur chaque table. Mais du fait de 2), ces filtres étaient du type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
(date_début <=début_période ET date_fin>fin_période) OU date_début est manquant
Je me retrouve donc avec des requêtes dont la clause WHERE est pleine de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
(condition_1) OU (condition_2) OU (condition_N)
en plus des jointures. Niveau performance, c'est pas ça non plus...

Finalement, j'ai créé une table intermédiaire SITUATION entre PERSONNE et le tables qui fait le lien pour une période données. Mais du coup, cette table contient 15 clés etrangères, et fait 3 millions de lignes, donc niveau performance, c'est pas génial.

Si quelqu'un a une idée pour remédier à mon problème, je suis preneur !!!