Bonsoir,
Les points de vue peuvent être multiples, mais je donne celui du praticien du relationnel.
En remontant à un niveau conceptuel, votre exemple des auteurs et des livres est applicable à un cas particulier : celui des associations de plusieurs à plusieurs, non porteuses de données, stables dans le temps, ce qui est quand même limité et ne mérite pas d’être élevé au rang de « paradigme » (sic !)
Modélisons l’exemple sous forme d’un diagramme dans lequel ce que vous appelez « normalisation » est respecté :
Si l’on vous suit, la table REDACTION disparaît et ses attributs sont exportés pour moitié dans la table AUTEUR d’une part et dans la table LIVRE d’autre part :
Dans ce diagramme, {LivreId} représente soit une relation (au sens de la théorie relationnelle, c'est-à-dire un ensemble), soit un sac (bag, doublons autorisés). Question : qu’est-ce que {LivreId} dans votre système, une relation ? Un sac ? (Pour des raisons de symétrie évidentes, la question vaut pour {AuteurId}). Si {LivreId} et {AuteurId} sont des sacs, alors les tables AUTEUR et LIVRE sont à leur tour des sacs, et l’algèbre relationnelle ne s’applique plus : merci alors de décrire les opérateurs de l’algèbre des sacs que vous utilisez.
Par contre, si {LivreId} est une relation, c’est un ensemble et les doublons sont de facto interdits. Comment garantissez-vous alors l’unicité des valeurs de cet ensemble ?
Vous écrivez : « La solution réside dans la dénormalisation des données ».
Quelle forme normale est en cause ? Sachez que du point de de vue de la théorie relationnelle, si {LivreId} et {AuteurId} représentent des relations, alors en réalité ce sont des RVA (Relation-Valued Attributes) et selon votre modélisation, AUTEUR et LIVRE respectent (au moins) la première forme normale. Vous lirez avec profit ce qu’a écrit C. J. Date à ce sujet dans Database Design and Relational Theory: Normal Forms and All That Jazz (Theory in Practice), au chapitre 4. Pour mémoire, les RVA ne datent quand même pas d’aujourd’hui, elles ont été présentées par Date et Darwen en 1991, dans Relational Databases, Writings 1989-1991, ainsi que les opérateurs dont elles sont l’objet.
Questions :
— Quelle algèbre utilisez-vous dans votre système ? Quels en sont les opérateurs ?
— Comment garantissez-vous l’intégrité référentielle ?
— En comparant les figures 1 et2 ci-dessus, on comprend que vous mettez manifestement en cause l’opération de jointure. Où est votre prototype de performances et son bilan chiffré prouvant que votre système est tellement supérieur ès matière, que JOIN est bon pour être rangé au rayon des accessoires obsolètes ? Vous ne démontrez rien, vous ne faites qu’affirmer : opinions et incantations ne suffisent pas.
En passant, quand vous écrivez :
« L'idée est de dupliquer le minimum de données du document B dans A et de préférence, celles qui ne changent pas souvent, car lors de leur mise à jour, nous devrions faire un update sur l'ensemble des documents qui les contiennent, plutôt qu'à un seul endroit dans une base de données normalisée. N'oublions pas que ces modifications augmenteront le temps d'écriture. »
Selon la figure 1 ci-dessus, pour répondre à une question portant sur les seules données propres à un auteur : nom, prénom, indépendamment des ouvrages auxquels il a collaboré, la consultation de la table AUTEUR suffit. Maintenant, si un tuple de la table donne lieu à un enregistrement physique, selon la figure 2, certes la consultation de la table AUTEUR suffit là aussi, mais cet enregistrement physique est pondéralement surchargé par les données (images des « clés primaires ») relatives aux livres.
Supposons maintenant que l’on veuille savoir quels auteurs ont rédigé quels chapitres des livres. Selon la figure ci-dessous, ça sera simple. En effet, la structure de la figure 1 évolue ainsi :
Que devient votre propre structure ?
Dans le cas de la figure 3, pour répondre à la question, utilisons par exemple SQL :
1 2 3
| SELECT AuteurNom, AuteurPrenom, LivreNom, ChapitreNo
FROM AUTEUR AS x JOIN REDACTION AS y ON x.AuteurId = y.AuteurId
JOIN LIVRE AS z ON y.LivreId = z.LivreId ; |
Merci de fournir la requête équivalente dans le contexte de votre propre système.
Vous concluez ainsi :
« Encore une fois, vous l'aurez remarqué, on vient d'assister à un bel exemple de retour vers le passé »
Phrase malheureuse ! Je remplacerais volontiers « bel » par un de ses antonymes...
Bref, étoffez, étayez, quantifiez, prouvez.
Partager