Bonjour.
Je travail actuellement sur une base issue d’un progiciel (plus précisément, export d’une partie de la base), et je m’interroge sur la nécessité de la remodeler, et surtout COMMENT !!
Le modèle est en grande partie construit comme sur le schéma_1 (en pièce jointe).
Non, non, ce n’est pas un modèle en étoile, et mis à part la forme, on en est loin…
En réalité, ce ne sont pas 5 mais plutôt une 20aine de tables qui « gravitent » autour de PERSONNE.
Pour être plus précis, les données qu’elles contiennent sont de plusieurs types :
- données répétitives fixes (finissant pas RF_x). A une date donnée, une personne peut cumuler plusieurs occurrences dans ces tables. Ce sera par exemple le cas des enfants d’une personne si on se borne à ne s’intéresser qu’à leur existence.
- données uniques historiques (finissant par UH_x).A une personne donnée et à une date entre date_debut et date_fin, ne correspondra qu’1 ou zéro occurrence dans ces tables. Cette information évolue dans le temps et on en garde l’historique. C’est le cas par exemple de la résidence principal d’un individu
- données répétitives historiques (finissant pas RH_x). Hé ben c’est le mix des deux : à un instant T, à une personne peut correspondre 0 ou N occurrences dans ces tables. C’est par exemple les comptes bancaires d’une personne.
Comme vous pouvez le constater, niveau contraintes d’intégrité, ce modèle est plutôt simpliste et un select qui ne relie ces tables que par comparaison de clés croisera toutes les occurrences de toutes les autres tables pour une personne donnée (une sorte de mini produit cartésien).
Je peux donc me retrouver avec une personne vivant dans un appartement avec un enfant qui n’est pas encore né… C’est donc principalement le caractère historique des ces données qui me posent problème.
Il est bien évident que les date_début et date_fin de toutes ces tables ne sont pas forcément égales. Les périodes de validité peuvent se chevaucher ou non.
J’ai attaqué ce problème sous plusieurs angles, notamment dans ce post et celui-là. J’ai abouti à un nouveau schéma (cf. schéma_2 en pièce jointe)
Mais ma table SITUATION comporte 3 millions de lignes et les performances lors des requêtes ne sont vraiment pas au rendez-vous, alors qu’au final, chaque requête n’attaque que 2 ou 3 de ces tables...
Cette solution ne me satisfait pas, et à force de retourner le problème dans tous les sens, mes neurones commencent à disjoncter…
Si quelqu’un à une expérience sur ce type de schéma, merci de me mettre sur la voie. Pour les autres, un regard neuf sur mon problème me ferait le plus grand bien.
[EDIT]Désolé, j'avais oublié d'inséré les liens vers les posts cités [/EDIT]
Partager