Fusionner trois tables en chaîne — élèves, classes, coefficients…
Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 6 — Traiter des données en tables · Fusionner sans rien perdre
Énoncé
Fusionner trois tables en chaîne — élèves, classes, coefficients d'option. L'ordre des deux fusions change-t-il le résultat ? Et le nombre de lignes intermédiaires ?
Corrigé
options = [{"option": "NSI", "coefficient": 4},
{"option": "SVT", "coefficient": 3},
{"option": "SES", "coefficient": 3}]
a = fusion(fusion(eleves, classes, "classe"), options, "option")
b = fusion(fusion(eleves, options, "option"), classes, "classe")
Les deux rendent lignes, portant les mêmes sept descripteurs — classe, coefficient, moyenne, nom, option, professeur, salle. La comparaison ligne à ligne, après tri, montre que les deux tables sont identiques.
**Pourquoi l'ordre est indifférent ici.** Les deux clés sont uniques dans leurs tables respectives, et chaque élève a une correspondance des deux côtés : aucune ligne n'est perdue, quel que soit l'ordre. La fusion est alors associative.
Ce qui change quand une correspondance manque. En retirant la 1G1 de la table des classes, les deux ordres rendent lignes — encore identiques. La fusion reste associative parce qu'elle ne fait qu'intersecter : une ligne survit si et seulement si elle a une correspondance dans les deux tables, et cette condition ne dépend pas de l'ordre.
Ce qui, en revanche, dépend de l'ordre. Le coût. Commencer par la fusion la plus sélective réduit la table intermédiaire, donc le travail de la seconde. Sur cinq lignes c'est invisible ; sur des millions, c'est le métier des bases de données de terminale — leur optimiseur ne fait rien d'autre que choisir cet ordre.
Attention : l'associativité tombe dès qu'on emploie fusion_gauche, qui ne perd rien à gauche mais tout à droite. L'ordre devient alors décisif.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.