Guide technique

Systèmes de Données Produit qui Fonctionnent Vraiment : De l'ERP au Canal de Vente

Comment concevoir des pipelines de données produit. ERP vers PIM, vers recherche, vers commerce, vers export. Classification, variantes, assets et distribution multi-canal.

21 mars 202614 min de lectureÉquipe d'Ingénierie Oronts

Le Problème des Données Produit dont Personne ne Parle

Les données produit ont l'air simples dans un tableur. Nom, description, prix, image. Puis la réalité te rattrape. Tu as 50 000 produits avec 200 attributs chacun, en 12 langues, provenant de 3 systèmes sources, distribués sur 5 canaux de sortie, et la qualité des données est incohérente sur l'ensemble.

Le vrai problème, ce n'est pas de stocker les données produit. N'importe quelle base de données fait ça. Le vrai problème, c'est le pipeline : comment les données circulent des systèmes sources à travers l'enrichissement jusqu'aux canaux de sortie, avec de la validation à chaque étape et des formats différents pour chaque destination.

On a conçu des systèmes de données produit pour des fabricants B2B avec des hiérarchies de classification complexes, du contenu multi-locale, de l'intégration ERP et de la distribution multi-canal (web, recherche, marketplace, export). Cet article couvre les patterns d'architecture. Pour l'implémentation PIM spécifiquement, consulte notre guide d'implémentation PIM. Pour les patterns de workflow Pimcore, consulte notre guide workflow Pimcore.

Le Pipeline : De la Source au Canal

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│   SOURCES     │     │   MASTER      │     │   CANAUX      │
│               │     │               │     │               │
│  ERP/SAP     │────▶│  Système PIM  │────▶│  Site web      │
│  Fournisseurs│     │  (Pimcore,    │     │  Index recherche│
│  Tableurs    │     │   Akeneo)     │     │  Marketplace   │
│  Saisie man. │     │               │     │  Print/PDF     │
│              │     │  Enrichir     │     │  API partenaire│
│              │     │  Valider      │     │  Flux de données│
│              │     │  Approuver    │     │               │
└──────────────┘     └──────────────┘     └──────────────┘

Couche Source

Les produits entrent dans le système depuis plusieurs sources. Chaque source a une qualité de données différente, des formats différents et des fréquences de mise à jour différentes.

SourceQualité des donnéesFormatFréquence
ERP (SAP, Oracle)Structuré, fiableAPI / fichier platBatch quotidien ou temps réel
Flux fournisseursVariable, souvent désordonnésCSV, XML, JSONHebdomadaire ou à la demande
Saisie manuelleHaute qualité, faible volumeUI admin PIMContinue
Import tableurSujet aux erreursXLSX, CSVPonctuel

La couche d'import doit gérer : le mapping de champs (le fournisseur l'appelle "item_name", l'ERP l'appelle "MATNR"), la transformation de données (prix en EUR vers centimes), la déduplication (même produit depuis deux sources) et la résolution de conflits (quelle source gagne pour quel champ).

C'est exactement le problème que notre Vendure Data Hub Plugin résout avec 9 extracteurs, 61 opérateurs de transformation et un mapping de champs configurable.

Couche Master (PIM)

Le PIM est la source unique de vérité pour les données produit. Chaque champ a une valeur faisant autorité. Chaque modification est versionnée. Chaque produit passe par un workflow éditorial avant publication.

Responsabilités clés du PIM :

  • Enrichissement des données : ajouter les descriptions, images et traductions qui ne viennent pas de l'ERP
  • Classification : assigner les produits à des catégories hiérarchiques avec des attributs typés
  • Validation : s'assurer que les champs obligatoires sont remplis avant publication
  • Workflow : revue éditoriale et approbation avant que les données n'atteignent les canaux de sortie
  • Versioning : suivre chaque modification, permettre l'édition de brouillons sans impacter les données en ligne

Couche Canal

Chaque canal de sortie a besoin des données produit dans un format différent :

CanalFormatContenuFréquence de mise à jour
Site webAPI JSONProduit complet avec images, descriptions, variantesTemps réel (event-driven)
Index de rechercheDocument dénormaliséChamps recherchables, facettes, prixQuasi temps réel
MarketplaceFlux XML/CSVChamps spécifiques à la plateforme, catégoriesPlanifié (horaire/quotidien)
Print/PDFDonnées structuréesChamps sélectionnés, images haute résolutionÀ la demande
API partenaireREST/GraphQLChamps contractuels uniquementTemps réel
Flux de donnéesCSV/XMLGoogle Merchant, Meta CatalogPlanifié

Les mêmes données produit, transformées différemment pour chaque canal. Le PIM stocke les données master. La couche de distribution transforme et livre.

Systèmes de Classification

Les produits ont des attributs. Une chaussure a une taille, une couleur, un matériau et un type de semelle. Un robinet a un débit, un type de raccord, une finition et une certification. Un serveur a un CPU, de la RAM, du stockage et des unités rack.

Attributs Plats vs Classification Store

Les attributs plats (colonnes sur la table produit) fonctionnent pour les catalogues simples avec des produits uniformes. Chaque produit a les mêmes champs.

Les classification stores (clé-valeur dynamique avec groupes) fonctionnent pour les catalogues diversifiés où différents types de produits ont des attributs différents.

Classification Store:
├── Groupe: Dimensions
│   ├── Clé: width (float, unité: mm)
│   ├── Clé: height (float, unité: mm)
│   └── Clé: depth (float, unité: mm)
├── Groupe: Technique
│   ├── Clé: flow_rate (float, unité: l/min)
│   ├── Clé: pressure (float, unité: bar)
│   └── Clé: connection_type (select: 3/8", 1/2", 3/4")
├── Groupe: Certifications
│   ├── Clé: ce_mark (boolean)
│   ├── Clé: tuv (boolean)
│   └── Clé: energy_label (select: A-G)

Les classification stores passent à l'échelle avec des milliers d'attributs sans changement de schéma. De nouveaux attributs se gèrent par configuration, pas par migration. Mais ils sont plus difficiles à interroger (lookups clé-valeur au lieu d'accès par colonne) et plus difficiles à valider (le schéma est dynamique).

Dans Pimcore, le Classification Store fournit cette capacité nativement avec des valeurs localisées, une organisation par groupes et une intégration à l'UI d'admin.

Gestion des Variantes

Les produits avec des variantes (taille, couleur, configuration) sont la source de la majeure partie de la complexité des données.

Architecture des Variantes

Product (parent)
├── name: "Running Shoe Pro"
├── description: "..."
├── brand: "..."
├── images: [hero.jpg, detail.jpg]
│
├── Variant: Taille 40, Noir
│   ├── sku: "RSP-40-BLK"
│   ├── price: 12900  (centimes)
│   ├── stock: 15
│   └── ean: "4012345678901"
│
├── Variant: Taille 40, Blanc
│   ├── sku: "RSP-40-WHT"
│   ├── price: 12900
│   ├── stock: 8
│   └── ean: "4012345678902"
│
└── Variant: Taille 42, Noir
    ├── sku: "RSP-42-BLK"
    ├── price: 12900
    ├── stock: 0  (rupture de stock)
    └── ean: "4012345678903"

Données héritées vs spécifiques à la variante :

  • Héritées (du parent) : nom, description, marque, catégorie, images partagées
  • Spécifiques à la variante : SKU, prix, stock, EAN, taille, couleur, images spécifiques à la variante

Le modèle d'héritage réduit la duplication. Tu changes la description du produit une fois, et elle se met à jour pour toutes les variantes. Mais les overrides spécifiques à la variante doivent être possibles (prix différent par taille, image différente par couleur).

L'Explosion Combinatoire

Un produit avec 5 tailles et 8 couleurs a 40 variantes. Ajoute 3 matériaux et tu en as 120. Ajoute 2 largeurs et tu en as 240. La plupart de ces combinaisons n'existent pas en tant que vrais produits.

Solutions :

  • Variantes explicites uniquement : créer seulement les combinaisons qui existent. Pas de génération automatique.
  • Matrice de disponibilité : définir quelles combinaisons sont valides. Générer automatiquement uniquement les combinaisons valides.
  • Variantes virtuelles : calculer au moment de la requête à partir des ensembles d'attributs. Ne pas stocker de lignes individuelles.

Pipeline d'Assets

Les images produit, dessins techniques, PDF et modèles 3D ont besoin de leur propre pipeline.

Upload/Import
  │
  ├── Validation du format (type, taille, résolution)
  ├── Extraction de métadonnées (EXIF, dimensions)
  ├── Génération de miniatures (plusieurs tailles)
  ├── Distribution CDN
  └── Association au produit/variante

Défis liés aux Assets

DéfiSolution
Plusieurs tailles d'images nécessairesGénérer les miniatures à l'upload ou à la demande
Images fournisseurs de faible qualitéExigences de résolution minimale, workflow de rejet
Association asset-produitConvention de nommage (basée sur le SKU) ou assignation manuelle
Coûts de stockage à grande échelleCloud storage (S3, Azure Blob) avec CDN
Assets localisésImages différentes par locale (lifestyle vs technique)

Pour Pimcore spécifiquement, on a documenté un bug de performance où les lookups de dimensions d'assets déclenchent des I/O vers le stockage distant à chaque rendu de page. Le correctif est décrit dans notre guide de mise à niveau Pimcore.

Distribution Multi-Canal

Distribution Event-Driven

Quand un produit est publié dans le PIM, des événements déclenchent la distribution vers chaque canal :

// Le PIM publie le produit -> les événements déclenchent les mises à jour des canaux
eventBus.on('product.published', async (product) => {
    await Promise.allSettled([
        searchIndexer.index(product),           // Mise à jour de la recherche
        feedGenerator.queue(product),            // Mise en file d'attente pour les flux marketplace
        cacheInvalidator.invalidate(product.id), // Invalidation du cache du site web
        partnerApi.notify(product.id),           // Notification des systèmes partenaires
    ]);
});

Chaque transformateur de canal convertit les données master au format spécifique du canal :

// Site web : données complètes avec champs SEO
function toWebProduct(product: PimProduct): WebProduct {
    return {
        slug: product.slug,
        name: product.name,
        description: product.description,
        seoTitle: product.seoTitle || product.name,
        seoDescription: product.seoDescription || truncate(product.description, 160),
        images: product.images.map(img => ({
            url: cdn.getUrl(img, 'large'),
            alt: img.alt || product.name,
        })),
        variants: product.variants.filter(v => v.active),
        // ... données produit complètes
    };
}

// Flux marketplace : format spécifique à la plateforme
function toGoogleMerchantItem(product: PimProduct, variant: PimVariant): MerchantItem {
    return {
        id: variant.sku,
        title: `${product.name} - ${variant.size} ${variant.color}`,
        description: stripHtml(product.description),
        link: `https://shop.example.com/p/${product.slug}`,
        image_link: cdn.getUrl(product.images[0], 'large'),
        price: `${(variant.price / 100).toFixed(2)} EUR`,
        availability: variant.stock > 0 ? 'in_stock' : 'out_of_stock',
        brand: product.brand,
        gtin: variant.ean,
        condition: 'new',
    };
}

Qualité des Données

Validation Automatisée

interface ValidationRule {
    field: string;
    check: (value: any, product: Product) => boolean;
    message: string;
    severity: 'error' | 'warning';
}

const VALIDATION_RULES: ValidationRule[] = [
    { field: 'name', check: (v) => v && v.length > 3, message: 'Le nom doit comporter au moins 3 caractères', severity: 'error' },
    { field: 'description', check: (v) => v && v.length > 50, message: 'La description devrait comporter au moins 50 caractères', severity: 'warning' },
    { field: 'images', check: (v) => v && v.length > 0, message: 'Au moins une image requise', severity: 'error' },
    { field: 'price', check: (v) => v && v > 0, message: 'Le prix doit être positif', severity: 'error' },
    { field: 'ean', check: (v) => !v || isValidEan(v), message: 'Format EAN invalide', severity: 'error' },
    { field: 'categories', check: (v) => v && v.length > 0, message: 'Au moins une catégorie requise', severity: 'error' },
];

Lance la validation avant la publication. Bloque la publication en cas d'erreurs. Affiche les avertissements mais autorise la publication. Suis les scores de qualité des données par produit, par catégorie, par fournisseur.

Erreurs Courantes

  1. Pas de source unique de vérité. Si les mêmes données produit vivent dans l'ERP, le PIM et le système de commerce sans master clairement défini, les conflits sont inévitables.

  2. L'ERP comme PIM. Les ERP stockent des données opérationnelles (SKU, prix, stock). Ils ne gèrent pas le contenu riche (descriptions, images, traductions). N'essaie pas de les y forcer.

  3. Pas de propriété des champs. Sans règles claires sur quelle source possède quel champ, les imports écrasent l'enrichissement manuel. Consulte notre guide workflow Pimcore pour le pattern de propriété des champs.

  4. Même format pour tous les canaux. Chaque canal a besoin de données différentes. Un flux Google Merchant et une API de site web ont des champs, des formats et des fréquences de mise à jour différents.

  5. Pas de validation avant publication. Les produits passent en ligne avec des images manquantes, des descriptions vides ou des EAN invalides. La validation automatisée empêche ça.

  6. Ignorer la complexité des variantes. Générer automatiquement toutes les combinaisons possibles crée des milliers de variantes fantômes. Ne crée que les combinaisons réelles et disponibles.

Points Clés à Retenir

  • Le pipeline, c'est l'architecture. Source vers master vers canal. Chaque étape a des responsabilités différentes, des formats de données différents et des exigences de qualité différentes.

  • Le PIM est la source unique de vérité. Pas l'ERP, pas le système de commerce, pas le tableur. Un master faisant autorité, avec versioning et workflow.

  • Les classification stores gèrent la diversité des attributs. Quand différents types de produits ont des attributs différents, le clé-valeur dynamique avec groupes passe mieux à l'échelle que des colonnes fixes.

  • Chaque canal a sa propre transformation. Site web, recherche, marketplace, print et API partenaire ont tous besoin de formats différents à partir des mêmes données master.

  • La qualité des données est un système, pas une étape. Validation automatisée, scores de qualité, règles de blocage à la publication. En continu, pas en une seule fois.

On conçoit des systèmes de données produit dans le cadre de nos pratiques ecommerce et data engineering. Si tu as besoin d'aide avec l'architecture PIM ou les pipelines de données produit, parle avec notre équipe ou demande un devis.

Sujets couverts

architecture PIMgestion données produitPimcore vs Akeneopipeline données produitMDMproduct information managementqualité données produit

Prêt à construire des systèmes IA prêts pour la production ?

Notre équipe est spécialisée dans les systèmes IA prêts pour la production. Discutons de comment nous pouvons aider.

Démarrer une conversation