Alimenter : ETL, qualité, RGPD
Ce que ce chapitre apporte 6 points
- Distinguer les trois étapes d'une alimentation et justifier leur ordre.
- Opposer ETL et ELT, et dire ce qui a fait basculer l'usage.
- Extraire sans relire toute la source, et charger de façon rejouable, dans un entrepôt comme dans une base NoSQL.
- Alimenter un modèle dimensionnel dans le bon ordre, avec des clés de substitution.
- Qualifier un jeu de données selon des critères mesurables.
- Identifier les contraintes que le RGPD fait peser sur les données, distinguer pseudonymisation et anonymisation, et mesurer un risque de réidentification.
Entre les sources et l'entrepôt se trouve la partie du travail que personne ne montre et qui occupe l'essentiel du temps. Elle consiste à extraire sans perturber, à transformer sans perdre, et à charger de façon qu'un rejeu ne casse rien. Elle consiste aussi à savoir ce que valent les données obtenues, et à traiter des informations personnelles sans se contenter de retirer les noms, ce qui ne suffit presque jamais.
Le chapitre précédent a construit un modèle cible. Il reste à le remplir, à partir de systèmes qui n'ont pas été conçus pour être lus par d'autres, qui changent sans prévenir, et dont les données contiennent des erreurs que personne n'a jamais eu besoin de corriger jusqu'ici.
Extraire, transformer, charger
Extraire : récupérer les données des systèmes sources, sans les perturber et sans en oublier.
Transformer : nettoyer, typer, normaliser les libellés, croiser les sources, appliquer les règles de gestion, calculer les clés.
Charger : écrire le résultat dans la cible, entrepôt, Data Mart ou base NoSQL.
Ce qui se fait à chaque étape, et ce qui ne s'y fait pas. À l'extraction, ne rien transformer. La tentation est forte de filtrer ou de convertir au passage, puisque c'est gratuit. C'est une erreur : une transformation faite ici n'est pas rejouable sans redemander la source, et l'erreur qu'elle introduit devient invisible et irrattrapable.
À la transformation, tout rendre explicite. Chaque règle de gestion appliquée doit être une opération nommée, testable et documentée. Une règle enfouie dans une requête de chargement finit par n'être connue de personne.
Au chargement, ne rien décider. Le chargement écrit ce qu'on lui donne. Toute logique métier qui s'y trouve est invisible depuis l'entrepôt et depuis les sources à la fois.
L'ELT charge les données brutes dans la cible, puis les transforme sur place, avec la puissance de la cible.
Le basculement d'usage a une cause précise : le stockage est devenu bon marché et les moteurs analytiques sont devenus capables de transformer des volumes considérables plus vite qu'un serveur d'intégration dédié. Garder le brut ne coûte donc presque rien, et transformer sur place coûte moins.
L'avantage décisif n'est pas la performance mais la rejouabilité. Une règle de gestion erronée découverte six mois plus tard se corrige en relançant la transformation sur le brut conservé. Un ETL ne le peut que s'il a prévu d'archiver ses extractions à part ; faute de quoi, il faut redemander aux sources ce qu'elles ne savent souvent plus fournir. L'ELT rend cette conservation inévitable, et c'est là son vrai mérite.
1.Pourquoi ne rien transformer à l'étape d'extraction ?
2.Quel est l'avantage décisif de l'ELT sur l'ETL ?
Extraire sans tout relire
Relire intégralement une source à chaque alimentation devient impossible dès que le volume grandit, et pèse sur un système de production qui a autre chose à faire.
Trois stratégies, de la plus simple à la plus juste. Extraction complète. Tout est relu à chaque fois. Simple, fiable, et acceptable jusqu'à quelques millions de lignes. Elle voit les suppressions par construction : une ligne absente de l'extraction a disparu de la source.
Extraction incrémentale. Seules les lignes dont la date de modification dépasse la dernière extraction sont relues. Efficace, et fragile : elle rate toute ligne supprimée, toute ligne modifiée sans que la date le soit, et les états intermédiaires d'une ligne modifiée deux fois entre deux passages.
Capture des changements. Le journal des transactions de la source est lu, ce qui donne chaque insertion, modification et suppression dans l'ordre, sans requête sur les tables. Parmi les stratégies qui ne relisent pas tout, c'est la seule qui voie les suppressions et chaque version d'une ligne. Elle pèse peu sur la source, mais suppose d'avoir accès à son journal, et que celui-ci soit conservé assez longtemps pour être lu.
Une ligne supprimée dans la source n'a plus de date de modification à comparer : elle n'existe plus. Elle reste donc indéfiniment dans l'entrepôt, et les totaux dérivent lentement, sans que rien ne le signale.
Le symptôme apparaît des mois plus tard, sous la forme d'un écart de quelques pour cent entre le chiffre de l'entrepôt et celui du système source, que personne n'arrive à expliquer.
Trois parades : lire le journal des transactions plutôt que les tables, obtenir de la source qu'elle marque les lignes supprimées au lieu de les effacer, ou faire une extraction complète périodique pour recaler.
Charger de façon rejouable
Une alimentation échoue. Le réseau coupe, la source répond mal, une machine redémarre. La question n'est pas d'éviter ces incidents mais de pouvoir relancer sans rien casser.
Un traitement est idempotent si l'exécuter deux fois donne le même résultat que l'exécuter une fois.
Un chargement qui ajoute des lignes ne l'est pas : deux exécutions doublent les données. Un chargement qui remplace une journée entière l'est : la seconde exécution écrase le résultat de la première.
Une alimentation interrompue au milieu laisse la cible dans un état inconnu : une partie des lignes est chargée, l'autre non, et personne ne sait laquelle.
Relancer un chargement par ajout double alors ce qui avait déjà été écrit. Ne pas relancer laisse un trou. Les deux issues sont mauvaises, et le choix se fait dans l'urgence, sur des données de production.
La règle qui évite tout cela : charger par remplacement d'une unité entière, en général une journée, ou l'une des partitions que le chapitre sur l'optimisation apprend à choisir, plutôt que par ajout de lignes. Relancer devient alors sans risque, et l'incident redevient un simple contretemps.
1.Que ne voit jamais une extraction incrémentale par date de modification ?
2.Qu'est-ce qu'un chargement idempotent ?
Alimenter un modèle dimensionnel
L'ordre n'est pas indifférent, et il découle des clés étrangères.
Les dimensions d'abord, les faits ensuite, toujours. Charger ou mettre à jour les dimensions. Chaque ligne source est rapprochée de la dimension par sa clé naturelle. Si elle est nouvelle, une ligne est créée avec une clé de substitution. Si elle a changé, on écrase ou on historise selon la décision prise au chapitre précédent.
Charger les faits. Chaque fait remplace ses clés naturelles par les clés de substitution des dimensions, obtenues par une recherche. Ce remplacement s'appelle la résolution des clés, et c'est l'opération la plus coûteuse de l'alimentation.
Charger les faits avant les dimensions produit des faits qui pointent vers des lignes inexistantes.
Un fait arrive avec un code produit qui n'existe dans aucune dimension. Le rejeter perd le chiffre d'affaires ; le charger avec une clé vide casse la jointure et le fait disparaît des totaux.
La pratique établie consiste à créer dans chaque dimension une ligne « inconnu », portant une clé de substitution réservée, vers laquelle pointent tous les faits orphelins.
Le total reste juste, l'anomalie devient visible et chiffrable au lieu d'être silencieuse, et l'on peut suivre son évolution : une dimension « inconnu » qui grossit signale une source qui dérive.
La figure suivante confronte les ventes du jour à la dimension client, au moment de résoudre les clés. Deux ventes n'y trouvent personne : l'une porte un code que le référentiel ignore, l'autre n'en porte aucun.
INNER JOIN … ON ne garde que les lignes appariées des deux côtés.
Vente_Jour(gauche, 4 lignes)
| idVente | codeClient | montant |
|---|---|---|
| 1 | C-12 | 120 |
| 2 | C-07 | 80 |
| 3 | C-40 | 35 |
| 4 | NULL | 60 |
Dim_Client(droite, 3 lignes)
| idClient | codeClient | segment |
|---|---|---|
| 0 | ? | inconnu |
| 1 | C-07 | Particulier |
| 2 | C-12 | Professionnel |
ON Vente_Jour.codeClient = Dim_Client.codeClient
| idVente | Vente_Jour.codeClient | montant | idClient | Dim_Client.codeClient | segment |
|---|---|---|---|---|---|
| 1 | C-12 | 120 | 2 | C-12 | Professionnel |
| 2 | C-07 | 80 | 1 | C-07 | Particulier |
SELECT *
FROM Vente_Jour
INNER JOIN Dim_Client
ON Vente_Jour.codeClient = Dim_Client.codeClientPasser sur LEFT : 4 lignes, 2 appariées et 2 de Vente_Jour sans correspondance. Les deux ventes reviennent, complétées à droite par des NULL en orange, que la jointure a fabriqués ; le NULL gris du code de la vente 4, lui, était déjà dans la source. Ce sont ces deux lignes que le chargement rattache à la clé 0 du membre inconnu.
Passer sur RIGHT : la ligne « inconnu » de Dim_Client reste seule de son côté. Un code NULL ne s'apparie à rien, pas même au « ? » du membre inconnu : c'est le chargement qui y rattache les ventes orphelines, jamais la jointure.
Le bloc suivant alimente une table de faits à partir d'une source qui ne connaît que les codes produits : la dimension existe déjà, les faits résolvent leurs clés, et le jour est chargé par remplacement.
DELETE et l'INSERT, une seconde fois à la suite des premiers : le résultat ne change pas, une vente par ligne et 253 en tout. Ne recopier que l'INSERT, sans le DELETE : chaque vente apparaît deux fois, et le total passe à 506. Remplacer enfin LEFT JOIN par JOIN dans le chargement : la ligne « inconnu » disparaît, et 25 du chiffre d'affaires avec elle, sans qu'aucune erreur ne s'affiche.
Qualifier un jeu de données
Avant d'exploiter des données, il faut savoir ce qu'elles valent. Cela se mesure, et un petit nombre de critères suffit.
Complétude. Quelle part des valeurs attendues est présente ? Se mesure par colonne, en pourcentage de valeurs renseignées.
Unicité. Combien de doublons sur la clé métier ? Se mesure en comparant le nombre de lignes au nombre de clés distinctes.
Validité. Quelle part des valeurs respecte le format, le domaine, l'intervalle attendus ? Une date de naissance en 1899 ou un code postal à quatre chiffres sont invalides.
Cohérence. Les données se contredisent-elles entre elles ou entre sources ? Une date de fin antérieure à une date de début, un total qui ne vaut pas la somme de ses lignes.
Fraîcheur. Quel âge a la donnée la plus récente ? Un entrepôt dont l'alimentation a échoué depuis trois jours répond toujours, et répond faux.
Exactitude. La valeur correspond-elle à la réalité ? C'est le seul critère qui ne se mesure pas depuis les données elles-mêmes, et il exige un référentiel externe ou un sondage.
La complétude compte les valeurs absentes, elle ne dit pas lesquelles. Supprimer les lignes incomplètes, ou remplacer chaque valeur manquante par la moyenne des valeurs connues, ne fausse rien quand le manque frappe au hasard. Dès que la probabilité qu'une valeur manque dépend de la valeur elle-même, les deux remèdes faussent la mesure, et dans le même sens. Un terminal de livraison qui, la plupart du temps, n'enregistre pas le délai d'une livraison de plus de deux heures perd précisément les retards : les lignes qui restent décrivent un service plus rapide que le vrai.
Les lignes complètes donnent un délai moyen de 76,3 minutes et 4,7 % de livraisons de plus de deux heures, quand la réalité est de 94,7 minutes et 17,9 %. Remplacer les manques par la moyenne n'arrange rien : la moyenne reste à 76,3, puisque c'est elle qui a été recopiée, et la part des retards tombe à 3,9 %, les 350 lignes complétées étant toutes rangées sous les deux heures. Perdre autant de lignes au hasard, en revanche, ne déplace presque rien : 94,8 minutes et 18,0 %. Ce n'est pas le nombre des manques qui fausse la mesure, c'est leur cause.
Aucun calcul sur les seules valeurs connues ne révèle ce biais, puisque les valeurs qui le montreraient sont celles qui manquent. Il se cherche dans la façon dont le manque se produit : la part des délais absents selon une colonne toujours renseignée, la distance ou le livreur par exemple, ou un échantillon de livraisons suivi par un autre moyen, comme pour l'exactitude. Un rapport de qualité donne donc la part des manques et l'hypothèse faite sur leur cause, pas un taux de complétude seul.
Mesurer la complétude d'une colonne et l'afficher sur un tableau de bord ne change rien tant que personne n'agit.
Une mesure de qualité doit porter un seuil et une conséquence : en dessous de tel taux, l'alimentation s'arrête et alerte, plutôt que de charger des données dont on sait qu'elles sont fausses.
Charger malgré tout, en espérant que quelqu'un remarquera, revient à propager l'erreur dans tous les tableaux de bord qui en dérivent, où elle sera bien plus difficile à retrouver.
Alimenter une base NoSQL
Charger une base de documents ou une base clé-valeur reprend les trois étapes, mais la transformation change de nature. Il ne s'agit plus de ranger chaque fait à sa place dans des tables : il faut construire, à partir de sources normalisées, l'objet que l'accès prévu lira d'un coup, la commande avec ses lignes et le libellé de ses produits, comme dans le chapitre sur les familles NoSQL. La transformation est une dénormalisation, décidée par les accès et non par les tables sources.
Le chargement, lui, se simplifie. Sans clé étrangère, aucun ordre n'est imposé entre ce qui décrit et ce qui est décrit. Et l'écriture se fait par clé : un document déjà présent est remplacé, jamais doublé, ce qui rend le chargement idempotent sans autre précaution, à condition que la clé se calcule toujours de la même façon à partir de la source.
Deux chargements par clé laissent deux documents ; la même alimentation faite par ajout en laisse quatre, et la commande 17 existe alors en deux exemplaires. Le prix est recopié au moment du chargement : une correction ultérieure du catalogue ne le touchera pas, et c'est voulu, puisque c'est le prix payé.
Une base de documents accepte un document dont un champ manque ou porte un mauvais type. Les contrôles de la section précédente se font donc avant le chargement, ou par la validation de schéma que la base propose : rien d'autre ne les fera.
1.Une alimentation charge les ventes du jour avant d'avoir ajouté à la dimension les produits créés le matin même. Que deviennent ces ventes ?
2.Une alimentation écrit des documents par leur clé, et elle est relancée après une coupure. Que contient la base ?
Les données personnelles
Une donnée à caractère personnel est, selon l'article 4 du règlement général sur la protection des données (le RGPD, règlement (UE) 2016/679), toute information se rapportant à une personne physique identifiée ou identifiable, directement ou indirectement.
Le mot décisif est identifiable. Un jeu sans nom ni identifiant reste composé de données personnelles si le recoupement de ses colonnes permet de retrouver quelqu'un.
Le RGPD pose à son article 5 six principes, et y ajoute la responsabilité : le responsable du traitement doit être en mesure de démontrer qu'il les respecte. Deux des six, la minimisation et la limitation de la conservation, ont des conséquences techniques immédiates.
Licéité, loyauté, transparence. Un traitement n'est licite que s'il repose sur l'une des six bases de l'article 6 : le consentement de la personne, l'exécution d'un contrat auquel elle est partie, une obligation légale, la sauvegarde des intérêts vitaux d'une personne, une mission d'intérêt public, ou l'intérêt légitime du responsable ou d'un tiers. Les personnes concernées doivent être informées du traitement.
Limitation des finalités. Les données sont collectées pour des finalités déterminées, explicites et légitimes, et ne sont pas traitées ensuite d'une manière incompatible avec elles. Un traitement ultérieur à des fins statistiques ou de recherche n'est pas réputé incompatible, à condition d'appliquer les garanties de l'article 89.
Minimisation. Seules les données adéquates, pertinentes et nécessaires à la finalité sont traitées. Cela contredit frontalement le réflexe du domaine, qui est de tout garder au cas où.
Exactitude. Les données inexactes sont effacées ou rectifiées sans tarder.
Limitation de la conservation. Les données ne restent sous une forme identifiante que le temps nécessaire à la finalité. À l'échéance, elles sont effacées ou anonymisées, y compris dans les sauvegardes et les copies dérivées : extractions, tables de l'entrepôt, fichiers du lac. Une conservation plus longue n'est admise qu'à des fins d'archivage dans l'intérêt public, de recherche ou de statistique, avec les garanties de l'article 89.
Intégrité et confidentialité. Une sécurité appropriée : chiffrement, contrôle d'accès, traçabilité des accès.
La responsabilité, enfin, se prouve par écrit. Le registre des activités de traitement (article 30) indique pour chaque traitement sa finalité, les catégories de personnes et de données concernées, leurs destinataires et, autant que possible, le délai prévu pour leur effacement.
Ce que le règlement impose à une architecture de données. Les données sensibles. Les données qui révèlent l'origine raciale ou ethnique, les opinions politiques, les convictions religieuses ou philosophiques ou l'appartenance syndicale, les données génétiques, les données biométriques servant à identifier une personne, et celles qui concernent la santé, la vie sexuelle ou l'orientation sexuelle forment des catégories particulières : leur traitement est interdit par principe (article 9), sauf dans les cas que l'article énumère, comme le consentement explicite de la personne.
L'analyse d'impact. Un traitement susceptible d'engendrer un risque élevé pour les personnes exige, avant sa mise en œuvre, une analyse d'impact relative à la protection des données (article 35). Le règlement la requiert en particulier pour le traitement à grande échelle de catégories particulières, et pour la surveillance systématique à grande échelle d'un lieu accessible au public : un lac qui conserve les images des caméras de toutes les stations d'un réseau de transport en relève.
Les droits des personnes. Chacun peut demander l'accès à ses données (article 15), leur rectification (article 16), leur effacement (article 17), la limitation de leur traitement (article 18), la portabilité de celles qu'il a fournies (article 20), et s'opposer à certains traitements (article 21). Une demande d'effacement doit atteindre toutes les copies, ce qui suppose de savoir où chaque donnée a été recopiée : le catalogue du lac et la traçabilité des alimentations servent aussi à cela.
Les sanctions. Méconnaître les principes, les bases légales, les règles des données sensibles ou les droits des personnes expose à une amende pouvant atteindre 20 millions d'euros ou, pour une entreprise, 4 % de son chiffre d'affaires annuel mondial, le montant le plus élevé étant retenu ; manquer aux obligations de sécurité (article 32) ou d'analyse d'impact, jusqu'à 10 millions d'euros ou 2 % (article 83). En France, la loi Informatique et Libertés du 6 janvier 1978 modifiée complète le règlement, et la CNIL en contrôle l'application.
Un jeu dont on a supprimé les noms et remplacé les identifiants par des codes, la table de correspondance étant gardée à part et protégée, est pseudonymisé (article 4). Pour qui détient cette table, il reste soumis au RGPD dans son intégralité.
Il devient anonyme seulement si plus personne ne peut y être réidentifié, par aucun moyen raisonnable, y compris par recoupement avec d'autres jeux. Cette condition est bien plus difficile à atteindre qu'il n'y paraît, et le bloc suivant montre pourquoi.
La distinction n'est pas rhétorique : un jeu anonyme sort du champ du RGPD, un jeu pseudonymisé n'en sort pas pour celui qui l'a produit. La Cour de justice de l'Union européenne a admis en 2025, à propos de données transmises par une institution de l'Union, qu'un destinataire sans aucun moyen raisonnable de réidentifier les personnes peut ne pas détenir, lui, de données personnelles ; celui qui a produit le jeu reste tenu de toutes ses obligations, l'information des personnes comprise.
1.Une boutique en ligne veut exploiter l'historique d'achat de ses clients. Entre combien de bases légales le RGPD lui laisse-t-il choisir pour fonder ce traitement ?
2.Une entreprise retire les noms de son fichier clients et remplace chaque identifiant par un code, en gardant à part la table de correspondance. Le fichier obtenu est…
Mesurer le risque de réidentification
Un quasi-identifiant est un attribut qui n'identifie personne à lui seul, mais qui, croisé avec d'autres, réduit la population à une seule personne.
Le code postal, la date de naissance et le sexe en sont l'exemple classique : chacun désigne des milliers de gens, leur combinaison en désigne souvent un seul.
La généralisation réduit le risque, et détruit de l'information. Le bloc montre l'effet de chaque élargissement : retirer le mois, remplacer le code postal par le département, l'année par une tranche. La part des personnes seules de leur combinaison passe de près des trois quarts à 2 %, puis à zéro, et k, la taille du plus petit groupe, monte de 1 à 21, puis à 211.
C'est la mécanique du k-anonymat : exiger que chaque combinaison de quasi-identifiants soit partagée par au moins k personnes. Un jeu où k vaut 1 n'est pas anonyme, quel qu'ait été le soin apporté à retirer les noms. La réciproque est fausse : un k élevé empêche seulement d'isoler une personne. Les autorités de protection européennes demandent deux choses de plus avant de parler d'anonymat : qu'on ne puisse pas relier le jeu à un autre pour retrouver quelqu'un, et qu'on ne puisse pas en déduire, de façon quasi certaine, une information sur une personne. Isoler, relier, déduire : un jeu n'est anonyme que s'il résiste aux trois.
Et c'est aussi la limite de l'exercice. Chaque généralisation supprime de l'information réelle : une analyse par tranche de dix ans ne répond plus aux questions qui portaient sur l'année. L'anonymisation n'est pas gratuite, elle s'achète en précision.
Supposons dix adhérents d'une salle de sport partageant la même combinaison de quasi-identifiants, donc k valant 10. Si tous les dix ont eu un prélèvement rejeté, connaître la combinaison de quelqu'un suffit à savoir qu'il en a eu un, sans jamais l'avoir identifié individuellement. L'information que le jeu devait protéger, qu'on appelle en anonymisation la valeur sensible, n'a pas besoin d'appartenir aux catégories particulières du RGPD pour mériter cette protection.
Des critères complémentaires existent pour cela, exigeant une diversité minimale des valeurs sensibles à l'intérieur de chaque groupe.
La leçon générale, elle, est indépendante des critères : l'anonymat se mesure, il ne se décrète pas, et la mesure doit être refaite chaque fois qu'une colonne est ajoutée au jeu.
Dix adhérents partagent la même combinaison de quasi-identifiants, et tous ont eu un prélèvement rejeté. Le jeu est-il protégé ?
Mettre en pratique
Une alimentation se juge sur deux nombres : le volume qu'elle déplace à chaque exécution, et la part de données qu'elle laisse passer sans les qualifier.
Chiffrer une alimentation et sa qualité
- 1.
Une source pèse 500 gigaoctets et 0,5 % des lignes changent chaque jour. Quel volume, en gigaoctets, une extraction incrémentale déplace-t-elle ?
- 2.
Par quel facteur l'extraction complète dépasse-t-elle l'extraction incrémentale ?
- 3.
Sur 1 000 lignes chargées, 980 portent une valeur dans le champ obligatoire. Quel est le taux de complétude, en pour cent ?
- 4.
Le seuil d'acceptation est fixé à 99 %. Combien de lignes manquantes de plus feraient basculer le lot sous ce seuil, sachant qu'il en manque déjà 20 ?
La dernière question n'a pas de piège de calcul, elle a un piège de lecture : le lot est déjà sous le seuil, à 98 %. Aucune ligne supplémentaire n'est nécessaire pour le faire basculer, il l'est avant même qu'on ait commencé à compter. Un critère de qualité ne sert à rien s'il n'est pas confronté à la mesure avant le chargement.
Une alimentation quotidienne charge les ventes par ajout de lignes. Elle échoue à mi-parcours un mardi. Que se passe-t-il, et comment éviter la situation ?
La cible contient une partie des ventes du mardi, sans que rien n'indique laquelle. Relancer double ce qui est déjà chargé ; ne pas relancer laisse un trou. Les deux options faussent les totaux, et le choix se fait dans l'urgence.
La correction est structurelle : charger par remplacement de la journée plutôt que par ajout. Le traitement devient idempotent, une relance écrase le partiel, et l'incident redevient un contretemps.
C'est l'une des rares décisions de conception qui ne coûte rien à la mise en place et évite une classe entière d'incidents.
L'entrepôt affiche 3 % de chiffre d'affaires de plus que le système source, et l'écart grandit chaque mois. Quelle cause chercher en premier ?
Les suppressions non répercutées, presque certainement.
Une extraction incrémentale fondée sur une date de modification ne voit pas les lignes supprimées, puisqu'elles n'existent plus pour être comparées. Les commandes annulées restent donc dans l'entrepôt indéfiniment, et l'écart s'accumule.
Le profil de l'écart le confirme : un écart constant viendrait d'une règle de gestion différente, un écart qui grandit vient d'un flux qui ajoute sans jamais retirer.
Les remèdes sont ceux du chapitre : lire le journal des transactions, obtenir un marquage logique des suppressions, ou recaler par une extraction complète périodique.
Une salle de sport publie, pour une étude sur la fréquentation, le fichier de ses adhérents sans nom ni numéro d'adhérent, avec le code postal, la date de naissance, le sexe, les heures de passage et les prélèvements rejetés. Peut-on le considérer comme anonyme ?
Non. Le code postal, la date de naissance et le sexe forment le quasi-identifiant classique, et leur combinaison désigne fréquemment une seule personne parmi les habitants d'un même code postal. Les heures de passage aggravent le cas : qui sait à quelle heure un voisin vient s'entraîner peut le retrouver sans même connaître sa date de naissance.
Le jeu n'est pas anonyme, ni même pseudonymisé au sens du règlement : la pseudonymisation suppose que les lignes ne puissent plus être rattachées à une personne sans une information gardée à part, et ici les colonnes publiées y suffisent. Il est composé de données personnelles, que le RGPD couvre entièrement. Le publier, c'est livrer à n'importe qui les habitudes et les incidents de paiement de personnes identifiables.
Pour s'approcher de l'anonymat, il faut généraliser jusqu'à ce que chaque combinaison soit partagée par un nombre suffisant de personnes : le département plutôt que le code postal, l'année ou une tranche plutôt que la date exacte, la demi-journée plutôt que l'heure. Puis vérifier la diversité des prélèvements rejetés à l'intérieur de chaque groupe, sans quoi l'appartenance au groupe suffit à révéler l'information. Puis vérifier qu'aucun autre jeu publié ne permet de recouper les groupes. Tant que ces trois vérifications ne sont pas passées, le jeu reste personnel, et le publier reste un traitement soumis à tout le règlement.
Et refaire cette mesure à chaque colonne ajoutée.
Un flux charge chaque nuit des faits dont 2 % portent un code produit absent de la dimension. Que faire ?
Ni les rejeter, ni les charger avec une clé vide.
Les rejeter perd 2 % du chiffre d'affaires, silencieusement, et les totaux de l'entrepôt cessent de correspondre à la réalité.
Les charger sans clé casse la jointure vers la dimension, et ils disparaissent de toute analyse qui passe par le produit, donc de presque toutes.
La pratique consiste à les rattacher à un membre « inconnu » de la dimension : le total reste juste, l'anomalie devient chiffrable, et son évolution se surveille. Deux pour cent stables signalent un référentiel incomplet ; deux pour cent qui grimpent signalent une source qui a changé sans prévenir.
Il faut ensuite traiter la cause, qui est presque toujours un référentiel produit alimenté moins souvent que les ventes.
Chapitre révisé en octobre 2026 · Une erreur dans ce chapitre ?
Dans la bibliothèque d'exercices
Le volume qu'une extraction déplace, et la personne seule de sa combinaison.
- Ce qu'une extraction déplace vraimentNiveau 2
- Le document que l'accès litNiveau 2
- Rejouer un chargementNiveau 3
- Seule de sa combinaisonNiveau 3
- Qualifier un lot de livraisonsNiveau 3
- Charger sans revenir en arrièreNiveau 3
- Généraliser jusqu'à kNiveau 3
- Historiser un changement de segmentNiveau 3