Show Menu
TEMAS×

Asignación de base de datos

La asignación SQL de nuestro esquema de ejemplo proporciona el siguiente 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>

Descripción

El elemento raíz del esquema ya no es <srcschema> , sino <schema> .
Esto nos lleva a otro tipo de documento, que se genera automáticamente a partir del esquema de origen, llamado simplemente esquema. La aplicación Adobe Campaign utilizará este esquema.
Los nombres SQL se determinan automáticamente según el nombre y el tipo del elemento.
Las reglas de nomenclatura SQL son las siguientes:
  • tabla: concatenación de la Área de nombres y el nombre del esquema
    En nuestro ejemplo, el nombre de la tabla se introduce mediante el elemento principal del esquema en el atributo sqltable :
    <element name="recipient" sqltable="CusRecipient">
    
    
  • field: nombre del elemento precedido por un prefijo definido según el tipo ('i' para entero, 'd' para doble, 's' para cadena, 'ts' para fechas, etc.)
    El nombre del campo se introduce mediante el atributo sqlname para cada uno de los campos escritos <attribute> y <element> :
    <attribute desc="E-mail address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/> 
    
    
Los nombres SQL se pueden sobrecargar desde el esquema de origen. Para ello, rellene los atributos "sqltable" o "sqlname" en el elemento en cuestión.
La secuencia de comandos SQL para crear la tabla generada a partir del esquema extendido es la siguiente:
CREATE TABLE CusRecipient(
  iGender NUMERIC(3) NOT NULL Default 0,   
  sCity VARCHAR(50),   
  sEmail VARCHAR(80),
  tsCreated TIMESTAMP Default NULL);

Las restricciones de campo SQL son las siguientes:
  • no hay valores nulos en los campos numéricos y de fecha,
  • los campos numéricos se inicializan en 0.

Campos XML

De forma predeterminada, cualquier elemento escrito <attribute> y <element> escrito se asigna a un campo SQL de la tabla de esquema de datos. No obstante, puede hacer referencia a este campo en XML en lugar de en SQL, lo que significa que los datos se almacenan en un campo memo ("mData") de la tabla que contiene los valores de todos los campos XML. El almacenamiento de estos datos es un documento XML que observa la estructura del esquema.
Para rellenar un campo en XML, debe agregar el atributo xml con el valor "true" al elemento correspondiente.
Ejemplo : a continuación se presentan dos ejemplos de uso de campos XML.
  • Campo de comentarios multilínea:
    <element name="comment" xml="true" type="memo" label="Comment"/>
    
    
  • Descripción de los datos en formato HTML:
    <element name="description" xml="true" type="html" label="Description"/>
    
    
    El tipo "html" permite almacenar el contenido HTML en una etiqueta CDATA y mostrar una marca de edición HTML especial en la interfaz del cliente de Adobe Campaign.
El uso de campos XML permite agregar campos sin necesidad de modificar la estructura física de la base de datos. Otra ventaja es que se utilizan menos recursos (tamaño asignado a los campos SQL, límite en el número de campos por tabla, etc.).
La principal desventaja es que es imposible indexar o filtrar un campo XML.

Campos indizados

Los índices permiten optimizar el rendimiento de las consultas SQL utilizadas en la aplicación.
Se declara un índice a partir del elemento principal del esquema de datos.
<dbindex name="name_of_index" unique="true/false">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

Los índices obedecen las siguientes reglas:
  • Un índice puede hacer referencia a uno o varios campos de la tabla.
  • Un índice puede ser único (para evitar duplicados) en todos los campos si el atributo único contiene el valor "true".
  • El nombre SQL del índice se determina a partir del nombre SQL de la tabla y del nombre del índice.
Como estándar, los índices son los primeros elementos declarados del elemento principal del esquema.
Los índices se crean automáticamente durante la asignación de tablas (estándar o FDA).
Ejemplo :
  • Añadir un índice de la dirección de correo electrónico y la ciudad:
    <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>
    
    
  • Añadiendo un índice único al campo de nombre "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>
    
    

Gestión de claves

Una tabla debe tener al menos una clave para identificar un registro en la tabla.
Se declara una clave desde el elemento principal del esquema de datos.
<key name="name_of_key">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

Las claves obedecen las siguientes reglas:
  • Una clave puede hacer referencia a uno o varios campos de la tabla.
  • Una clave se conoce como 'principal' (o 'prioridad') cuando es la primera en el esquema que se rellena o si contiene el atributo interno con el valor "true".
  • Un índice único se declara implícitamente para cada definición de clave. La creación de un índice en la clave se puede evitar agregando el atributo noDbIndex con el valor "true".
Como estándar, las claves son los elementos declarados desde el elemento principal del esquema después de haber definido los índices.
Las claves se crean durante la asignación de tablas (estándar o FDA), Adobe Campaign busca índices únicos.
Ejemplo :
  • Añadiendo una clave para la dirección de correo electrónico y la ciudad:
    <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>
    
    
    El esquema generó:
    <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>
    
    
  • Añadir una clave principal o interna en el campo de nombre "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>
    
    
    El esquema generó:
    <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>
    
    

Tecla Auto-incremental

La clave principal de la mayoría de las tablas de Adobe Campaign es un entero largo de 32 bits autogenerado por el motor de base de datos. El cálculo del valor clave depende de una secuencia (de forma predeterminada, la función SQL XtkNewId ) que genere un número único en toda la base de datos. El contenido de la clave se introduce automáticamente al insertar el registro.
La ventaja de una clave incremental es que proporciona una clave técnica no modificable para las uniones entre tablas. Además, esta clave no ocupa mucha memoria porque utiliza un entero de byte doble.
Puede especificar en el esquema de origen el nombre de la secuencia que se utilizará con el atributo pkSequence . Si este atributo no se proporciona en el esquema de origen, se utilizará la secuencia predeterminada XtkNewId . La aplicación utiliza secuencias dedicadas para los esquemas nms:wideLog y nms:trackingLog ( NmsBroadLogId y NmsTrackingLogId respectivamente) porque son las tablas que contienen la mayor cantidad de registros.
Desde ACC 18.10, XtkNewId ya no es el valor predeterminado de la secuencia en los esquemas predeterminados. Ahora puede crear esquemas o ampliar el esquema existente con una secuencia dedicada.
Al crear un nuevo esquema o durante una ampliación de esquema, se debe mantener el mismo valor de secuencia de clave principal (@pkSequence) para todo el conjunto.
Una secuencia a la que se hace referencia en un esquema de Adobe Campaign ( NmsTrackingLogId , por ejemplo) debe asociarse a una función SQL que devuelve el número de ID en los parámetros, separados por comas. Esta función debe llamarse GetNewXXXIds , donde XXX es el nombre de la secuencia (por ejemplo, GetNewNmsTrackingLogIds ). Vista los archivos postgres-nms.sql , mssql-nms.sql o oracle-nms.sql que se proporcionan con la aplicación en el directorio datakit/nms/eng/sql/ para recuperar el ejemplo de creación de secuencias 'NmsTrackingLogId' para cada motor de base de datos.
Para declarar una clave única, rellene el atributo autopk (con el valor "true") en el elemento principal del esquema de datos.
Ejemplo :
Declaración de una clave incremental en el esquema de origen:
<srcSchema name="recipient" namespace="cus">
  <element name="recipient" autopk="true">
  ...
  </element>
</srcSchema>

El esquema generó:
<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>

Además de la definición de la clave y su índice, se ha agregado un campo numérico denominado "id" al esquema ampliado para contener la clave principal generada automáticamente.
Un registro con una clave principal establecida en 0 se inserta automáticamente al crear la tabla. Este registro se utiliza para evitar las uniones externas, que no son efectivas en las tablas de volumen. De forma predeterminada, todas las claves externas se inicializan con el valor 0 para que siempre se pueda devolver un resultado en la combinación cuando el elemento de datos no se rellene.