Show Menu
TÓPICOS×

Mapeamento de banco de dados

O mapeamento SQL do nosso esquema de exemplo fornece o seguinte 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>

Descrição

O elemento raiz do esquema não é mais <srcschema> , mas <schema> .
Isso nos leva a outro tipo de documento, que é gerado automaticamente a partir do esquema de origem, simplesmente chamado de esquema. Esse esquema será usado pelo aplicativo Adobe Campaign.
Os nomes SQL são determinados automaticamente com base no nome e no tipo do elemento.
As regras de nomenclatura SQL são as seguintes:
  • tabela: concatenação do namespace e nome do esquema
    Em nosso exemplo, o nome da tabela é inserido pelo elemento principal do esquema no atributo sqltable :
    <element name="recipient" sqltable="CusRecipient">
    
    
  • campo: nome do elemento precedido por um prefixo definido de acordo com o tipo ('i' para integer, 'd' para double, 's' para string, 'ts' para datas etc.)
    O nome do campo é inserido pelo atributo sqlname para cada tipo <attribute> e <element> :
    <attribute desc="E-mail address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/> 
    
    
Os nomes SQL podem ser sobrecarregados do esquema de origem. Para fazer isso, preencha os atributos "sqltable" ou "sqlname" no elemento em questão.
O script SQL para criar a tabela gerada a partir do esquema estendido é o seguinte:
CREATE TABLE CusRecipient(
  iGender NUMERIC(3) NOT NULL Default 0,   
  sCity VARCHAR(50),   
  sEmail VARCHAR(80),
  tsCreated TIMESTAMP Default NULL);

As restrições de campo SQL são as seguintes:
  • sem valores nulos nos campos numéricos e de data,
  • campos numéricos são inicializados para 0.

Campos XML

Por padrão, qualquer elemento digitado <attribute> e <element> é mapeado em um campo SQL da tabela de esquema de dados. No entanto, é possível fazer referência a esse campo no XML em vez do SQL, o que significa que os dados são armazenados em um campo de memorando ("mData") da tabela que contém os valores de todos os campos XML. O armazenamento desses dados é um documento XML que observa a estrutura do esquema.
Para preencher um campo em XML, é necessário adicionar o atributo xml com o valor "true" ao elemento em questão.
Exemplo : há dois exemplos de uso de campo XML.
  • Campo de comentário de várias linhas:
    <element name="comment" xml="true" type="memo" label="Comment"/>
    
    
  • Descrição dos dados em formato HTML:
    <element name="description" xml="true" type="html" label="Description"/>
    
    
    O tipo "html" permite que você armazene o conteúdo HTML em uma tag CDATA e exiba uma verificação de edição HTML especial na interface do cliente do Adobe Campaign.
O uso de campos XML permite adicionar campos sem a necessidade de modificar a estrutura física do banco de dados. Outra vantagem é que você usa menos recursos (tamanho alocado para campos SQL, limite do número de campos por tabela etc.).
A principal desvantagem é que é impossível indexar ou filtrar um campo XML.

Campos indexados

Os índices permitem otimizar o desempenho das consultas SQL usadas no aplicativo.
Um índice é declarado do elemento principal do esquema de dados.
<dbindex name="name_of_index" unique="true/false">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

Os índices obedecem às seguintes regras:
  • Um índice pode fazer referência a um ou mais campos na tabela.
  • Um índice pode ser exclusivo (para evitar duplicatas) em todos os campos se o atributo exclusivo contiver o valor "true".
  • O nome SQL do índice é determinado pelo nome SQL da tabela e pelo nome do índice.
Como padrão, os índices são os primeiros elementos declarados do elemento principal do esquema.
Os índices são criados automaticamente durante o mapeamento de tabela (padrão ou FDA).
Exemplo :
  • Adicionando um índice ao endereço de email e à cidade:
    <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>
    
    
  • Adicionando um índice exclusivo ao campo de 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>
    
    

Gestão das chaves

Uma tabela deve ter pelo menos uma chave para identificar um registro na tabela.
Uma chave é declarada do elemento principal do esquema de dados.
<key name="name_of_key">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

As teclas obedecem às seguintes regras:
  • Uma tecla pode fazer referência a um ou mais campos na tabela.
  • Uma chave é conhecida como "primária" (ou "prioridade") quando é a primeira no esquema a ser preenchida ou se contém o atributo interno com o valor "true".
  • Um índice exclusivo é declarado implicitamente para cada definição de chave. A criação de um índice na chave pode ser impedida adicionando o atributo noDbIndex com o valor "true".
Como padrão, as chaves são os elementos declarados do elemento principal do esquema depois que os índices foram definidos.
As chaves são criadas durante o mapeamento de tabela (padrão ou FDA), o Adobe Campaign encontra índices exclusivos.
Exemplo :
  • Adicionando uma chave ao endereço de email e à cidade:
    <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>
    
    
    O esquema gerado:
    <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>
    
    
  • Adicionando uma chave primária ou interna no campo de 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>
    
    
    O esquema gerado:
    <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 incremental automaticamente

A chave primária da maioria das tabelas do Adobe Campaign é um número inteiro de 32 bits gerado automaticamente pelo mecanismo de banco de dados. O cálculo do valor chave depende de uma sequência (por padrão, a função SQL XtkNewId ) que gera um número exclusivo no banco de dados inteiro. O conteúdo da chave é automaticamente inserido na inserção do registro.
A vantagem de uma chave incremental é que ela fornece uma chave técnica não modificável para as junções entre tabelas. Além disso, essa chave não ocupa muita memória porque usa um número inteiro de dois bytes.
Você pode especificar no esquema de origem o nome da sequência a ser usada com o atributo pkSequence . Se esse atributo não for fornecido no esquema de origem, a sequência padrão XtkNewId será usada. O aplicativo usa sequências dedicadas para os esquemas nms:wideLog e nms:trackingLog ( NmsBroadLogId e NmsTrackingLogId , respectivamente) porque essas são as tabelas que contêm mais registros.
De ACC 18.10, XtkNewId não é mais o valor padrão para a sequência nos esquemas predefinidos. Agora você pode criar um esquema ou estender um esquema existente com uma sequência dedicada.
Ao criar um novo schema ou durante uma extensão de schema, você precisa manter o mesmo valor de sequência da chave primária (@pkSequence) para todo o schema.
Uma sequência referenciada em um esquema do Adobe Campaign ( NmsTrackingLogId , por exemplo) deve ser associada a uma função SQL que retorna o número de IDs nos parâmetros, separadas por vírgulas. Essa função deve ser chamada de GetNewXXXIds , onde XXX é o nome da sequência ( GetNewNmsTrackingLogIds , por exemplo). Visualize os arquivos postgres-nms.sql , mssql-nms.sql ou oracle-nms.sql fornecidos com o aplicativo no diretório datakit/nms/eng/sql/ para recuperar o exemplo de criação de uma sequência 'NmsTrackingLogId' para cada mecanismo de banco de dados.
Para declarar uma chave exclusiva, preencha o atributo autopk (com o valor "true") no elemento principal do esquema de dados.
Exemplo :
Declarando uma chave incremental no esquema de origem:
<srcSchema name="recipient" namespace="cus">
  <element name="recipient" autopk="true">
  ...
  </element>
</srcSchema>

O esquema gerado:
<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>

Além da definição da chave e seu índice, um campo numérico chamado "id" foi adicionado ao esquema estendido para conter a chave primária gerada automaticamente.
Um registro com uma chave primária definida como 0 é automaticamente inserido na criação da tabela. Este registro é usado para evitar junções externas, que não são eficazes em tabelas de volume. Por padrão, todas as chaves estrangeiras são inicializadas com o valor 0 para que um resultado possa sempre ser retornado na junção quando o item de dados não for preenchido.