Show Menu
THEMEN×

Datenbankzuordnung

Die SQL-Zuordnung unseres Beispielschemas enthält das folgende XML-Dokument:
<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>

Beschreibung

Das Stammelement des Schemas ist nicht mehr <srcschema> sondern <schema> .
Dies führt uns zu einem anderen Dokumenttyp, der automatisch aus dem Quellschema generiert wird, das einfach als Schema bezeichnet wird. Dieses Schema wird von der Adobe Campaign-Anwendung verwendet.
Die SQL-Namen werden automatisch anhand des Elementnamens und des Elementtyps bestimmt.
Die SQL-Benennungsregeln lauten wie folgt:
  • Tabelle: Verkettung des Schema-Namespace und des Namens
    In unserem Beispiel wird der Name der Tabelle über das Hauptelement des Schemas im Attribut " sqltable "eingegeben:
    <element name="recipient" sqltable="CusRecipient">
    
    
  • Feld: Name des Elements, dem ein Präfix vorangestellt wird, der nach Typ ('i' für Ganzzahl, 'd' für Doppelpunkt, 's' für Zeichenfolge, 'ts' für Datumsangaben usw.) definiert ist
    Der Feldname wird über das Attribut sqlname für jede Eingabe <attribute> und <element> :
    <attribute desc="E-mail address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/> 
    
    
SQL-Namen können aus dem Quellschema überladen werden. Füllen Sie dazu die Attribute "sqltable"oder "sqlname"für das betreffende Element aus.
Das SQL-Skript zum Erstellen der aus dem erweiterten Schema generierten Tabelle lautet wie folgt:
CREATE TABLE CusRecipient(
  iGender NUMERIC(3) NOT NULL Default 0,   
  sCity VARCHAR(50),   
  sEmail VARCHAR(80),
  tsCreated TIMESTAMP Default NULL);

Die SQL-Feldbeschränkungen lauten wie folgt:
  • keine Nullwerte in numerischen und Datumsfeldern,
  • Numerische Felder werden auf 0 initialisiert.

XML-Felder

Standardmäßig werden alle typisierten <attribute> und <element> eingestellten Elemente einem SQL-Feld der Datenschemakabelle zugeordnet. Sie können dieses Feld jedoch in XML anstatt in SQL referenzieren. Das bedeutet, dass die Daten in einem Memofeld ("mData") der Tabelle gespeichert werden, das die Werte aller XML-Felder enthält. Die Speicherung dieser Daten ist ein XML-Dokument, das die Schemastruktur einhält.
Um ein Feld in XML auszufüllen, müssen Sie dem betreffenden Element das XML -Attribut mit dem Wert "true"hinzufügen.
Beispiel : Es gibt zwei Beispiele für die Verwendung von XML-Feldern.
  • Mehrzeiliges Kommentarfeld:
    <element name="comment" xml="true" type="memo" label="Comment"/>
    
    
  • Beschreibung der Daten im HTML-Format:
    <element name="description" xml="true" type="html" label="Description"/>
    
    
    Mit dem Typ "html"können Sie den HTML-Inhalt in einem CDATA-Tag speichern und eine spezielle HTML-Bearbeitungsüberprüfung in der Adobe Campaign-Client-Oberfläche anzeigen.
Mithilfe von XML-Feldern können Sie Felder hinzufügen, ohne die physische Struktur der Datenbank ändern zu müssen. Ein weiterer Vorteil besteht darin, dass Sie weniger Ressourcen verwenden (Größe, Größe, Anzahl der Felder pro Tabelle usw.).
Der Hauptnachteil ist, dass es unmöglich ist, ein XML-Feld zu indizieren oder zu filtern.

Indexierte Felder

Mithilfe von Indizes können Sie die Leistung der in der Anwendung verwendeten SQL-Abfragen optimieren.
Ein Index wird aus dem Hauptelement des Datenschemas deklariert.
<dbindex name="name_of_index" unique="true/false">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

Indizes folgen den folgenden Regeln:
  • Ein Index kann auf ein oder mehrere Felder in der Tabelle verweisen.
  • Ein Index kann in allen Feldern eindeutig sein (um Duplikate zu vermeiden), wenn das Attribut unique den Wert "true"enthält.
  • Der SQL-Name des Indexes wird anhand des SQL-Namens der Tabelle und des Indexnamens bestimmt.
Als Standard sind Indizes die ersten Elemente, die aus dem Hauptelement des Schemas deklariert wurden.
Indizes werden während der Tabellenzuordnung (Standard oder FDA) automatisch erstellt.
Beispiel :
  • Hinzufügen eines Index zur E-Mail-Adresse und zum Ort:
    <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>
    
    
  • Hinzufügen eines eindeutigen Indexes zum Feld "id"-Name:
    <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>
    
    

Verwaltung von Schlüsseln

Eine Tabelle muss über mindestens einen Schlüssel zur Identifizierung eines Datensatzes in der Tabelle verfügen.
Ein Schlüssel wird aus dem Hauptelement des Datenschemas deklariert.
<key name="name_of_key">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

Schlüssel beachten die folgenden Regeln:
  • Ein Schlüssel kann auf ein oder mehrere Felder in der Tabelle verweisen.
  • Ein Schlüssel wird als "primär"(oder "Priorität") bezeichnet, wenn er der erste im auszufüllenden Schema ist oder wenn er das interne Attribut mit dem Wert "true"enthält.
  • Für jede Schlüsseldefinition wird implizit ein eindeutiger Index deklariert. Die Erstellung eines Indexes auf dem Schlüssel kann verhindert werden, indem das Attribut noDbIndex mit dem Wert "true"hinzugefügt wird.
Standardmäßig sind Schlüssel die Elemente, die nach der Definition von Indizes aus dem Hauptelement des Schemas deklariert wurden.
Schlüssel werden bei der Tabellenzuordnung (Standard oder FDA) erstellt, Adobe Campaign findet eindeutige Indizes.
Beispiel :
  • Hinzufügen eines Schlüssels zur E-Mail-Adresse und zum Ort:
    <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>
    
    
    Das erstellte Schema:
    <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>
    
    
  • Hinzufügen eines primären oder internen Schlüssels zum Namensfeld "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>
    
    
    Das erstellte Schema:
    <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>
    
    

Auto-Inkrementalschlüssel

Der Hauptschlüssel der meisten Adobe Campaign-Tabellen ist eine 32-Bit-Ganzzahl, die automatisch von der Datenbank-Engine generiert wird. Die Berechnung des Schlüsselwerts hängt von einer Sequenz ab (standardmäßig die SQL-Funktion XtkNewId ), die eine eindeutige Zahl in der gesamten Datenbank generiert. Der Inhalt des Schlüssels wird beim Einfügen des Datensatzes automatisch eingegeben.
Der Vorteil eines inkrementellen Schlüssels besteht darin, dass er einen nicht-modifizierbaren technischen Schlüssel für die Verbindungen zwischen Tabellen bereitstellt. Darüber hinaus belegt dieser Schlüssel nicht viel Arbeitsspeicher, da er eine Double-Byte-Ganzzahl verwendet.
Sie können im Quellschema den Namen der Sequenz angeben, die mit dem pkSequence -Attribut verwendet werden soll. Wenn dieses Attribut nicht im Quellschema angegeben ist, wird die XtkNewId -Standardsequenz verwendet. Die Anwendung verwendet dedizierte Sequenzen für die nms:wideLog - und nms:trackingLog -Schemata ( NmsBroadLogId bzw. NmsTrackingLogId ), da diese Tabellen die meisten Datensätze enthalten.
Ab ACC 18.10 ist XtkNewId nicht mehr der Standardwert für die Sequenz in den vordefinierten Schemata. Sie können nun ein Schema erstellen oder ein vorhandenes Schema mit einer dedizierten Sequenz erweitern.
Beim Anlegen eines neuen Schemas oder bei einer Schema-Erweiterung müssen Sie für das gesamte Schema den gleichen Wert für die Primärschlüsselfolge (@pkSequence) beibehalten.
Eine Sequenz, die in einem Adobe Campaign-Schema referenziert wird (z. B. NmsTrackingLogId ), muss mit einer SQL-Funktion verknüpft sein, die die Anzahl der IDs in den Parametern zurückgibt, durch Kommas getrennt. Diese Funktion muss GetNewXXXIds heißen, wobei XXX der Name der Sequenz ist (z. B. GetNewNmsTrackingLogIds ). Zeigen Sie die Dateien "postgres-nms.sql ", " mssql-nms.sql "oder " oracle-nms.sql "an, die mit der Anwendung im Ordner " datakit/nms/eng/sql/ "bereitgestellt wurden, um das Beispiel einer "NmsTrackingLogId"-Sequenzerstellung für jede Datenbank-Engine wiederherzustellen.
Um einen eindeutigen Schlüssel zu deklarieren, füllen Sie das Attribut autopk (mit dem Wert "true") im Hauptelement des Datenschemas aus.
Beispiel :
Deklarieren eines inkrementellen Schlüssels im Quellschema:
<srcSchema name="recipient" namespace="cus">
  <element name="recipient" autopk="true">
  ...
  </element>
</srcSchema>

Das erstellte Schema:
<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>

Zusätzlich zur Definition des Schlüssels und seines Indexes wurde dem erweiterten Schema ein numerisches Feld namens "id"hinzugefügt, um den automatisch generierten primären Schlüssel zu enthalten.
Ein Datensatz mit einem Primärschlüssel auf 0 wird bei der Tabellenerstellung automatisch eingefügt. Dieser Datensatz wird verwendet, um äußere Verbindungen zu vermeiden, die bei Volumentabellen nicht wirksam sind. Standardmäßig werden alle Fremdschlüssel mit dem Wert 0 initialisiert, sodass ein Ergebnis immer bei der Verknüpfung zurückgegeben werden kann, wenn das Datenelement nicht gefüllt wird.