Show Menu
ARGOMENTI×

Mappatura database

La mappatura SQL dello schema di esempio fornisce il seguente documento XML:
<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>

Descrizione

L'elemento principale dello schema non è più <srcschema> , ma <schema> .
Questo ci porta a un altro tipo di documento, che viene generato automaticamente dallo schema di origine, semplicemente denominato schema. Questo schema verrà utilizzato dall'applicazione Adobe Campaign.
I nomi SQL vengono determinati automaticamente in base al nome e al tipo dell'elemento.
Le regole di denominazione SQL sono le seguenti:
  • tabella: concatenazione dello spazio dei nomi e del nome dello schema
    Nel nostro esempio, il nome della tabella viene immesso tramite l'elemento principale dello schema nell'attributo sqltable :
    <element name="recipient" sqltable="CusRecipient">
    
    
  • field: nome dell'elemento preceduto da un prefisso definito in base al tipo ('i' per integer, 'd' per double, 's' per stringa, 'ts' per date, ecc.)
    Il nome del campo viene immesso tramite l'attributo sqlname per ciascun tipo <attribute> e <element> :
    <attribute desc="E-mail address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/> 
    
    
I nomi SQL possono essere sovraccaricati dallo schema di origine. A tal fine, popolate gli attributi "sqltable" o "sqlname" sull'elemento interessato.
Lo script SQL per creare la tabella generata dallo schema esteso è il seguente:
CREATE TABLE CusRecipient(
  iGender NUMERIC(3) NOT NULL Default 0,   
  sCity VARCHAR(50),   
  sEmail VARCHAR(80),
  tsCreated TIMESTAMP Default NULL);

I vincoli del campo SQL sono i seguenti:
  • nessun valore nullo nei campi numerici e di data,
  • i campi numerici sono inizializzati a 0.

Campi XML

Per impostazione predefinita, qualsiasi elemento digitato <attribute> e <element> viene mappato su un campo SQL della tabella dello schema di dati. È tuttavia possibile fare riferimento a questo campo in XML invece che in SQL, il che significa che i dati vengono memorizzati in un campo Memo ("mData") della tabella contenente i valori di tutti i campi XML. La memorizzazione di questi dati è un documento XML che osserva la struttura dello schema.
Per compilare un campo in XML, è necessario aggiungere l'attributo xml con il valore "true" all'elemento interessato.
Esempio : di seguito sono riportati due esempi di utilizzo di campi XML.
  • Campo commento su più righe:
    <element name="comment" xml="true" type="memo" label="Comment"/>
    
    
  • Descrizione dei dati in formato HTML:
    <element name="description" xml="true" type="html" label="Description"/>
    
    
    Il tipo "html" consente di archiviare il contenuto HTML in un tag CDATA e di visualizzare un controllo speciale per la modifica HTML nell'interfaccia client di Adobe Campaign.
L'utilizzo di campi XML consente di aggiungere campi senza dover modificare la struttura fisica del database. Un altro vantaggio è rappresentato dal minor utilizzo di risorse (dimensione allocata ai campi SQL, limite al numero di campi per tabella, ecc.).
Lo svantaggio principale è che è impossibile indicizzare o filtrare un campo XML.

Campi indicizzati

Gli indici consentono di ottimizzare le prestazioni delle query SQL utilizzate nell'applicazione.
Un indice è dichiarato dall'elemento principale dello schema dati.
<dbindex name="name_of_index" unique="true/false">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

Gli indici obbediscono alle regole seguenti:
  • Un indice può fare riferimento a uno o più campi della tabella.
  • Un indice può essere univoco (per evitare duplicati) in tutti i campi se l'attributo univoco contiene il valore "true".
  • Il nome SQL dell'indice è determinato dal nome SQL della tabella e dal nome dell'indice.
Come standard, gli indici sono i primi elementi dichiarati dall'elemento principale dello schema.
Gli indici vengono creati automaticamente durante la mappatura della tabella (standard o FDA).
Esempio :
  • Aggiunta di un indice all’indirizzo e-mail e alla città:
    <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>
    
    
  • Aggiunta di un indice univoco al campo del nome "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>
    
    

Gestione delle chiavi

Una tabella deve avere almeno una chiave per identificare un record nella tabella.
Una chiave viene dichiarata dall'elemento principale dello schema dati.
<key name="name_of_key">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

Le chiavi obbediscono alle regole seguenti:
  • Una chiave può fare riferimento a uno o più campi nella tabella.
  • Una chiave è nota come 'principale' (o 'priorità') quando è la prima nello schema da compilare o se contiene l'attributo interno con il valore "true".
  • Un indice univoco viene dichiarato implicitamente per ogni definizione di chiave. È possibile impedire la creazione di un indice sulla chiave aggiungendo l'attributo noDbIndex con il valore "true".
Come standard, le chiavi sono gli elementi dichiarati dall'elemento principale dello schema dopo la definizione degli indici.
Le chiavi vengono create durante la mappatura della tabella (standard o FDA), Adobe Campaign trova indici univoci.
Esempio :
  • Aggiunta di una chiave all’indirizzo e-mail e alla città:
    <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>
    
    
    Schema generato:
    <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>
    
    
  • Aggiunta di una chiave primaria o interna al campo del nome "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>
    
    
    Schema generato:
    <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>
    
    

Tasto incrementale automatico

La chiave primaria della maggior parte delle tabelle di Adobe Campaign è un numero intero lungo 32 bit generato automaticamente dal motore del database. Il calcolo del valore chiave dipende da una sequenza (per impostazione predefinita, la funzione SQL XtkNewId ) che genera un numero univoco nell'intero database. Il contenuto della chiave viene inserito automaticamente all'inserimento del record.
Il vantaggio di una chiave incrementale è che fornisce una chiave tecnica non modificabile per i join tra le tabelle. Inoltre, questa chiave non occupa molta memoria perché utilizza un numero intero a doppio byte.
Potete specificare nello schema di origine il nome della sequenza da utilizzare con l'attributo pkSequence . Se questo attributo non viene specificato nello schema di origine, verrà utilizzata la sequenza predefinita XtkNewId . L'applicazione utilizza sequenze dedicate per gli schemi nms:wideLog e nms:trackingLog (rispettivamente NmsBroadLogId e NmsTrackingLogId ), in quanto queste tabelle contengono la maggior parte dei record.
Da ACC 18.10, XtkNewId non è più il valore predefinito per la sequenza negli schemi predefiniti. È ora possibile creare uno schema o estendere lo schema esistente con una sequenza dedicata.
Durante la creazione di un nuovo schema o durante un'estensione dello schema, è necessario mantenere lo stesso valore di sequenza della chiave primaria (@pkSequence) per l'intero schema.
Una sequenza cui viene fatto riferimento in uno schema di Adobe Campaign (ad esempio, NmsTrackingLogId ) deve essere associata a una funzione SQL che restituisce il numero di ID nei parametri, separati da virgole. Questa funzione deve essere denominata GetNewXXXIds , dove XXX è il nome della sequenza (ad esempio, GetNewNmsTrackingLogIds ). Visualizzare i file postgres-nms.sql , mssql-nms.sql o oracle-nms.sql forniti con l'applicazione nella directory datakit/nms/eng/sql/ per recuperare l'esempio di creazione di una sequenza 'NmsTrackingLogId' per ogni motore di database.
Per dichiarare una chiave univoca, compilare l'attributo autopk (con valore "true") sull'elemento principale dello schema dati.
Esempio :
Dichiarazione di una chiave incrementale nello schema di origine:
<srcSchema name="recipient" namespace="cus">
  <element name="recipient" autopk="true">
  ...
  </element>
</srcSchema>

Schema generato:
<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>

Oltre alla definizione della chiave e del relativo indice, allo schema esteso è stato aggiunto un campo numerico denominato "id" per contenere la chiave primaria generata automaticamente.
Un record con una chiave primaria impostata su 0 viene inserito automaticamente al momento della creazione della tabella. Questo record viene utilizzato per evitare i join esterni, che non sono efficaci sulle tabelle dei volumi. Per impostazione predefinita, tutte le chiavi esterne sono inizializzate con il valore 0, in modo che sia sempre possibile restituire un risultato sul join quando l'elemento dati non è popolato.