Bonsoir,
Envoyé par
pachot
je ne crois pas qu'on puisse construire un modèle physique de données correct seulement avec des règles mathématiques
Qui dit le contraire ? Tout le monde n’est pas Zaniolo. On commence par élaborer un modèle conceptuel de données (ou un diagramme de classes) à la façon de Tabourier, mais ceci fait on utilise des techniques telles que la normalisation en xNF pour s’assurer que les structures sont saines.
Envoyé par
pachot
En UML, cette analyse métier va se retrouver dans les Use Cases (pour le cycle de vie) et dans les notions d'aggrégation/composition et de navigabilité du diagramme de classe de ce(s) Use Case(s).
La plus belle fille ne peut offrir que ce qu’elle a... C’est bien beau, mais que l’on s’appuie sur UML ou Merise ou Corig ou que sais-je (chaque technologie, chaque méthode a ses fans), si dans les dossiers de conception il manque la moitié des règles de gestion, si elles sont floues, ambiguës, rien n’empêchera le projet de finir à la poubelle, une fois les développements terminés mais ne répondant pas à ce que demandait l’utilisateur ; on repartira pour tout recommencer avec une nouvelle équipe et une technologie conceptuelle de plus en plus pointue. Tant qu’il manquera des règles de gestion ou que celles-ci prêteront à confusion, ça pourra durer éternellement. J’ai expertisé de tels (gros) projets, non aboutis au bout de 10 ans... j’ai joué les Colombo et le plus souvent fait se réunir en « conclave » les chefs de projets et les utilisateurs le temps qu’il fallait, pour que par la maïeutique on arrive enfin à un dossier valide et pérenne. Je ne peux malheureusement pas citer ici les noms de clients et de sous-traitants, mais croyez-moi ça n’est pas l’envie qui m’en manque.
Envoyé par
pachot
Pas de formes normales
Dans les années soixante-dix, je ne connaissais pas, mais je normalisais d’instinct (M. Jourdain faisait bien de la prose...) car la redondance c’est de la dynamite et on n’est pas tous artificiers. La normalisation n’est certes pas la panacée, mais c’est un outil indispensable quand on veut modéliser proprement, éviter l’obésité des tables et les risques inhérents en mise à jour, etc. Qu’on ne vienne pas me raconter les histoires de multiplication des tables, séparées physiquement sur les disques, les I/O insupportables, thèmes rebattus depuis trente ans. Je redis ce que j’ai dit, on monte des prototypes de performance pour que l’on sache objectivement à quoi s’en tenir avant que les développements ne commencent (1000 utilisateurs qui secouent simultanément les commandes et provoquent des verrouillages finissant en étreinte fatale, etc.) Comment peut-on prétendre que normaliser est inutile (voire nuisible) ?!
Envoyé par
pachot
Pas de tabou des NULL
Je rappelle à cette occasion qu’une relation (au sens du Modèle Relationnel de Données, la table SQL n’étant qu’un semblant de relation) ne contient que des valeurs, rien que des valeurs. Je cite et traduis C.J. Date (The Relational Database Dictionary chez Apress) :
Null : Un montage, utilisé en particulier dans SQL, pour représenter l’information absente. Note : Par définition les nulls ne sont pas des valeurs (on les appelle parfois marques) ; il s’ensuit qu’un « type » qui « contient un null » n’est pas un type, un « tuple » qui « contient un null » n’est pas un tuple, une relation qui « contient un null » n’est pas une relation, qu’une relvar qui « contient un null » n’est pas une « relvar » [...]
Pour ma part, j’adhère à la théorie relationnelle et ne peut donc faire la promotion du bonhomme Null, même si c’est parfois tentant. A chacun de choisir (et justifier) son paradigme. De mon côté, il n’y a pas là de tabou (qui est un interdit d’origine sociale ou religieuse), seulement une conclusion de l’étude des effets de la logique trivaluée.
Je rappelle en passant que le développeur A qui utilise l’opérateur INTERSECT tandis que le développeur B utilise l’opérateur JOIN pour traiter le même problème peuvent obtenir des résultats différents à cause de Null.
Envoyé par
pachot
Pas de règles aveugles, pas de mythes qui viennent des technologies aujourd'hui obsolètes...
Un point sur lequel nous devrions être a priori d’accord, à ceci près que je ne vois pas à quelles règles et à quelles technologies vous faites allusion...
Envoyé par
pachot
Et pour les NOT IN où là aussi ça n'a pas trop de sens.
A savoir ? (A noter que je n’utilise pas NOT IN mais NOT EXISTS, eu égard à Frege). Si à la logique des prédicats vous préférez l’algèbre, on peut utiliser EXCEPT...
Envoyé par
pachot
On voit souvent des systèmes en production qui souffrent de trop de tables et trop d'index. Des process qui doivent aller chercher des infos éparpillées dans toute la base. Et du coup, les équipes d'exploitation pensent qu'il faut dénormaliser et introduit des redondances pour arriver à quelque chose de performant et scalable.
Tout ceci est la conséquence d’une modélisation approximative. Quand j’ai eu à valider chez un client de mon entreprise un système donnant lieu au final à près de 2000 tables (dont certaines plutôt copieuses), bien urbanisé en référentiels (Personnes, Contrats, Produits, Cotisations, Prospection, Habilitations, Événements, etc.), normalisé en 4NF, il n’y a eu aucun problème important lors du prototypage des performances, même si ça a coûté de la sueur et si j’y ai passé des nuits et des nuits. Et quand l’entreprise a fusionné son informatique avec celle de son concurrent, c’est elle qui a hébergé sans problème les données de ce dernier.
Cela dit, je suis d’accord, ça n’est pas aux équipes d’exploitation de dénormaliser, elles doivent se rapprocher des Études et c’est aux DBA (Exploitation & Études) de quantifier les éventuels bienfaits de la chose. Je vous renvoie à ce sujet à une anecdote que j’aurais pu intituler « C’est la faute à la 3NF ! » et où l'on voit qu'il y avait erreur de cible...
Envoyé par
pachot
Mon but était seulement d'attirer l'attention sur le fait qu'une approche trop théorique dans la modélisation peut amener des problèmes de performance et de scalabilité lors de son exploitation.
Je ne sais pas ce que vous entendez par « trop » théorique. Quoi qu’il en soit, après avoir pratiqué tous les métiers en informatique, de la soute à dunette, après avoir pratiqué le fer à souder, et avoir aussi ferraillé dans tous les sens (avec les éditeurs, les auteurs, les théoriciens, etc.), je défends la thèse selon laquelle, sans un bagage théorique suffisant on peut faire n’importe quoi, en toute incompétence, un peu à la façon d’un développeur qui n’aurait jamais appris un minimum d’algorithmique. Si Ted Codd (un théoricien, un vrai !) n’avait pas inventé la théorie relationnelle, on en serait encore à utiliser des bases de données façon hiérarchique, réseau, liste inverse ou que sais-je, et cette discussion n’aurait pas lieu.
Envoyé par
pachot
en SQL ANSI la norme est claire: 2 nulls ne sont pas égaux.
Forcément, Null n’étant pas une valeur on ne peut pas lui appliquer l’opérateur d’égalité.
A propos de la norme SQL, je rappelle la magnifique boulette qu’on y trouve (page 30) et d’aucuns se sont fait remonter les bretelles :
The data type boolean comprises the distinct truth values True and False. Unless prohibited by a NOT NULL constraint, the boolean data type also supports the truth value Unknown as the null value. This specification does not make a distinction between the null value of the boolean data type and the truth value Unknown that is the result of an SQL <predicate>, <search condition>, or <boolean value expression>; they may be used interchangeably to mean exactly the same thing.
Comme le note malicieusement Peter Gulutzan (SQL-99 Complete, Really), selon la norme il revient au même de dire : « Je ne sais pas » et « Je sais que l’information est absente » !
Envoyé par
pachot
Il manque une composante. 10 millisecondes c'est le temps de service de ces I/O.
Par prototypage des performances, on mesura le surcoût, par exemple pour fixer les idées, pour 200000 transactions/jour impliquant la table CHEQUE. Il m’étonnerait que ça soit rédhibitoire. Même combat pour les commandes : si les IO fichaient la patouille, on rapatrierait les lignes de commande dans les commandes, mais je n’ai jamais observé qu’on en fut réduit à une telle extrémité...
Envoyé par
pachot
Le calcul 'une ligne=un I/O' se base sur des accès à des données dispersés, car je parlais du 'listing des numéros de chèques du dernier mois'. Le clustering sur l'ID ne va pas beaucoup aider pour cela. Il faudrait un clustering sur type d'opération et date pour cet exemple.
Ceci vaut quelque soit le scénario, que le numéro de chèque figure dans la table OPERATION_COMPTABLE ou dans la table CHEQUE. Par ailleurs, il y a plusieurs façons d’effectuer les traitements périodiques quand la table CHEQUE est impliquée. Par exemple :
— Jointure des deux tables ;
— Production à partir de la table OPERATION_COMPTABLE d’une table temporaire contenant les valeurs d’OperId des chèques concernés ;
— ...
Lister les numéros de chèques du dernier mois est une opération de type batch (en transactionnel l’utilisateur risquerait d'être découragé...), et là encore un prototype de performances permettra de choisir la solution la plus efficace aujourd’hui (et remplaçable le jour où l’on trouvera plus performant), sans que l’on touche à la structure des tables. A la Production de préciser qu’elle fenêtre elle accorde pour le traitement, à nous de nous y conformer. Cela dit le forum SCHÉMA est orienté modélisation, et je pense qu'on n’est donc pas là pour débattre des problèmes de production et des meilleures stratégies pour les résoudre.
Envoyé par
pachot
Mais ni l'un ni l'autre ne donne d'indication à l'optimiseur, contrairement aux contraintes.
C'est-à-dire ? Quoi qu’il en soit, si avec DB2 for z/OS je branche par exemple un nouvel index sur une table, je peux déclencher un rebind des trigger packages pour réoptimiser :
DB2 - Commande REBIND TRIGGER PACKAGE :
« You might also rebind a trigger package to re-optimize its SQL statements after you create a new index or use the RUNSTATS utility. »
Partager