Show Menu
SUJETS×

Mapping de la base de données

Le mapping SQL de notre schéma d'exemple donne le document XML suivant :
<schema mappingType="sql" name="recipient" namespace="cus" xtkschema="xtk:schema">
  <enumeration basetype="byte" name="gender">    
    <value label="Not specified" name="unknown" value="0"/>    
    <value label="Male" name="male" value="1"/>    
    <value label="Female" name="female" value="2"/> 
  </enumeration>  

  <element name="recipient" sqltable="CusRecipient">    
    <attribute desc="Recipient e-mail address" label="Email" length="80" name="email" sqlname="sEmail" type="string"/>    
    <attribute default="GetDate()" label="Date of creation" name="created" sqlname="tsCreated" type="datetime"/>    
    <attribute enum="gender" label="Gender" name="gender" sqlname="iGender" type="byte"/>    
    <element label="Location" name="location">      
      <attribute label="City" length="50" name="city" sqlname="sCity" type="string" userEnum="city"/>    
    </element>  
  </element>
</schema>

Description

L'élément racine du schéma n'est plus <srcschema> , mais <schema> .
Nous sommes sur un autre type de document qui est généré automatiquement à partir du schéma source, on parle alors simplement de schéma. C'est ce schéma qui sera utilisé par l'application Adobe Campaign.
Les noms SQL sont déduits automatiquement en fonction du nom et du type de l'élément.
Les règles de nommage des noms SQL sont les suivantes :
  • table : concaténation de l'espace de nommage et du nom du schéma
    Dans notre exemple le nom de la table est renseigné à partir de l'élément principal du schéma dans l'attribut sqltable :
    <element name="recipient" sqltable="CusRecipient">
    
    
  • champ : nom de l'élément précédé d'un préfixe défini en fonction de son type ('i' pour entier, 'd' pour double, 's' pour chaîne, 'ts' pour les dates, etc.)
    Le nom du champ est renseigné à partir de l'attribut sqlname pour chaque <attribute> et <element> typé :
    <attribute desc="E-mail address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/> 
    
    
Les noms SQL peuvent être surchargés à partir du schéma source, il faut renseigner les attributs "sqltable" ou "sqlname" sur l'élément concerné.
Le script SQL de création de la table généré à partir du schéma étendu est le suivant :
CREATE TABLE CusRecipient(
  iGender NUMERIC(3) NOT NULL Default 0,   
  sCity VARCHAR(50),   
  sEmail VARCHAR(80),
  tsCreated TIMESTAMP Default NULL);

Les contraintes des champs SQL sont les suivantes :
  • pas de valeurs nulles sur les types numériques et dates,
  • les champs numériques sont initialisés à 0.

Champs XML

Par défaut, tout élément <attribute> et <element> typé est mappé sur un champ SQL de la table du schéma de données. Vous pouvez toutefois référencer ce champ au format XML plutôt que SQL, ce qui signifie que les données sont stockées dans un champ mémo ("mData") de la table contenant les valeurs de tous les champs XML. Le stockage de ces données est un document XML qui respecte la structure du schéma.
Pour renseigner un champ en XML, il faut ajouter l'attribut xml avec la valeur "true" sur l'élément concerné.
Exemple : voici deux exemples d'utilisation des champs de type XML.
  • Champ commentaire multi-lignes :
    <element name="comment" xml="true" type="memo" label="Comment"/>
    
    
  • Description de données au format HTML :
    <element name="description" xml="true" type="html" label="Description"/>
    
    
    Le type "html" permet de stocker le contenu HTML dans une balise CDATA et d'afficher un contrôle spécifique d'édition HTML dans l'interface cliente Adobe Campaign.
L'utilisation de champs XML permet d'ajouter des champs sans avoir à modifier la structure physique de la base. Un autre avantage est d'utiliser moins de ressources (taille alouée des champs SQL, limite sur le nombre de champs par table, etc.).
L'inconvénient principal est l'impossibilité d'indexer ou de filtrer un champ XML.

Champs indexés

Les index permettent d'optimiser les performances des requêtes SQL utilisées dans l'application.
Un index est déclaré à partir de l'élément principal du schéma de données.
<dbindex name="name_of_index" unique="true/false">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

Les index suivent les règles suivantes :
  • Un index peut référencer un ou plusieurs champs de la table.
  • Un index peut être unique (afin d'éviter les doublons) sur l'ensemble des champs qui le compose si l'attribut unique est renseigné avec la valeur "true".
  • Le nom SQL de l'index est déduit à partir du nom SQL de la table et du nom de l'index.
Par convention, les index sont les éléments déclarés en premier à partir de l'élément principal du schéma.
Les index sont crées automatiquement lors d'un mapping de table (mapping standard ou FDA).
Exemple :
  • Ajout d'un index sur l'email et la ville :
    <srcSchema name="recipient" namespace="cus">
      <element name="recipient">
        <dbindex name="email">
          <keyfield xpath="@email"/> 
          <keyfield xpath="location/@city"/> 
        </dbindex>
    
        <attribute name="email" type="string" length="80" label="Email" desc="E-mail address of recipient"/>
        <element name="location" label="Location">
          <attribute name="city" type="string" length="50" label="City" userEnum="city"/>
        </element>
      </element>
    </srcSchema>
    
    
  • Ajout d'un index unique sur le champ du nom "id" :
    <srcSchema name="recipient" namespace="cus">
      <element name="recipient">
        <dbindex name="id" unique="true">
          <keyfield xpath="@id"/> 
        </dbindex>
    
        <dbindex name="email">
          <keyfield xpath="@email"/> 
        </dbindex>
    
        <attribute name="id" type="long" label="Identifier"/>
        <attribute name="email" type="string" length="80" label="Email" desc="E-mail address of recipient"/>
      </element>
    </srcSchema>
    
    

Gestion des clés

Une table doit posséder au moins une clé permettant d'identifier un enregistrement de la table.
Une clé est déclarée à partir de l'élément principal du schéma de données.
<key name="name_of_key">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

Les clés suivent les règles suivantes :
  • Une clé peut référencer un ou plusieurs champs de la table.
  • Une clé est dite primaire (ou prioritaire) lorsqu'elle est renseignée en premier dans le schéma ou si elle contient l'attribut internal avec la valeur "true".
  • Un index unique est implicitement déclaré pour chaque définition de clé. Il est possible d'empêcher la création de l'index sur la clé en ajoutant l'attribut noDbIndex avec la valeur "true".
Par convention, les clés sont les éléments déclarés à partir de l'élément principal du schéma après la définition des index.
Les clés sont crées lorsque, lors du mapping de la table (mapping standard ou FDA), Adobe Campaign trouve des index uniques.
Exemple :
  • Ajout d'une clé sur l'email et la ville :
    <srcSchema name="recipient" namespace="cus">
      <element name="recipient">
        <key name="email">
          <keyfield xpath="@email"/> 
          <keyfield xpath="location/@city"/> 
        </key>
    
        <attribute name="email" type="string" length="80" label="Email" desc="E-mail address of recipient"/>
        <element name="location" label="Location">
          <attribute name="city" type="string" length="50" label="City" userEnum="city"/>
        </element>
      </element>
    </srcSchema>
    
    
    Le schéma généré :
    <schema mappingType="sql" name="recipient" namespace="cus" xtkschema="xtk:schema">  
      <element name="recipient" sqltable="CusRecipient">    
       <dbindex name="email" unique="true">      
         <keyfield xpath="@email"/>      
         <keyfield xpath="location/@city"/>    
       </dbindex>    
    
       <key name="email">      
        <keyfield xpath="@email"/>      
        <keyfield xpath="location/@city"/>    
       </key>    
    
       <attribute desc="E-mail address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/>    
       <element label="Location" name="location">      
         <attribute label="City" length="50" name="city" sqlname="sCity" type="string" userEnum="city"/>    
       </element>  
      </element>
    </schema>
    
    
  • Ajout d'une clé primaire ou interne sur le champ de nom "id" :
    <srcSchema name="recipient" namespace="cus">
      <element name="recipient">
        <key name="id" internal="true">
          <keyfield xpath="@id"/> 
        </key>
    
        <key name="email" noDbIndex="true">
          <keyfield xpath="@email"/> 
        </key>
    
        <attribute name="id" type="long" label="Identifier"/>
        <attribute name="email" type="string" length="80" label="Email" desc="E-mail address of recipient"/>
      </element>
    </srcSchema>
    
    
    Le schéma généré :
    <schema mappingType="sql" name="recipient" namespace="cus" xtkschema="xtk:schema">  
      <element name="recipient" sqltable="CusRecipient">    
        <key name="email">      
          <keyfield xpath="@email"/>    
        </key>    
    
        <dbindex name="id" unique="true">      
          <keyfield xpath="@id"/>    
        </dbindex>    
    
        <key internal="true" name="id">      
         <keyfield xpath="@id"/>    
        </key>    
    
        <attribute label="Identifier" name="id" sqlname="iRecipientId" type="long"/>    
        <attribute desc="E-mail address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/>  
      </element>
    </schema>
    
    

Clé auto-incrémentale

La clé primaire de la plupart des tables Adobe Campaign est un entier long 32 bits auto-généré par le moteur de base de données. Le calcul de la valeur de la clé repose sur une séquence (par défaut la fonction SQL XtkNewId ) générant un nombre unique dans toute la base. Le contenu de la clé est automatiquement renseigné à l'insertion de l'enregistrement.
L'avantage d'une clé incrémentale est d'obtenir une clé technique non modifiable utilisée pour les jointures entre les tables. De plus, cette clé n'est pas consommatrice car elle utilise un entier sur deux octets.
Vous pouvez spécifier dans le schéma source le nom de la séquence à utiliser avec l'attribut pkSequence . Si cet attribut n'est pas indiqué dans le schéma source, la séquence XtkNewId par défaut est utilisée. L'application utilise des séquences dédiées pour les schémas nms:broadLog et nms:trackingLog ( NmsLargeLogId et NmsTrackingLogId respectivement), car il s'agit des tables qui contiennent le plus d'enregistrements.
À compter d’ACC 18.10, XtkNewId n’est plus la valeur par défaut de la séquence dans les schémas d’usine. Vous pouvez désormais créer ou étendre un schéma avec une séquence dédiée.
Lors de la création ou de l’extension d’un schéma, vous devez conserver la valeur de la séquence de la clé primaire (@pkSequence) pour l’ensemble du schéma.
Une séquence référencée dans un schéma Adobe Campaign ( NmsTrackingLogId par exemple) doit être associée à une fonction SQL qui renvoie le nombre d'identifiants dans les paramètres, séparés par des virgules. Cette fonction doit être appelée GetNew XXX Ids , où XXX est le nom de la séquence ( GetNewNmsTrackingLogIds par exemple). Affichez les fichiers postgres-nms.sql , mssql-nms.sql ou oracle-nms.sql fournis avec l'application dans le répertoire datakit/nms/eng/sql/ pour récupérer l'exemple de création de séquence 'NmsTrackingLogId' pour chaque moteur de base de données.
Pour déclarer une clé unique, il faut renseigner l'attribut autopk (avec la valeur "true") sur l'élément principal du schéma de données.
Exemple :
Déclaration d'une clé incrémentale dans le schéma source :
<srcSchema name="recipient" namespace="cus">
  <element name="recipient" autopk="true">
  ...
  </element>
</srcSchema>

Le schéma généré :
<schema mappingType="sql" name="recipient" namespace="cus" xtkschema="xtk:schema">  
  <element name="recipient" autopk="true" pkSequence="XtkNewId" sqltable="CusRecipient"> 
    <dbindex name="id" unique="true">
      <keyfield xpath="@id"/>
    </dbindex>

    <key internal="true" name="id">
      <keyfield xpath="@id"/>
    </key>

    <attribute desc="Internal primary key" label="Primary key" name="id" sqlname="iRecipientId" type="long"/>
  </element>
</schema>

En plus de la définition de la clé et de son index, un champ numérique de nom "id" a été ajouté dans le schéma étendu afin de contenir la clé primaire auto générée.
Un enregistrement avec une clé primaire à 0 est automatiquement inséré à la création de la table. Cet enregistrement est utilisé pour éviter les jointures externes, non efficaces sur les tables à volumes. Par défaut, toutes les clés étrangères sont initialisées avec la valeur 0, ce qui permet de toujours retourner un résultat sur la jointure lorsque la donnée n'est pas renseignée.