Show Menu
トピック×

データベースマッピング

この例のスキーマのSQLマッピングでは、次の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>

説明

スキーマのルート要素は、現在は存在しません <srcschema> ​が、 <schema> .
これにより、別のタイプのドキュメントが発生します。これは、ソーススキーマから自動的に生成され、単にスキーマと呼ばれます。 このスキーマは、Adobe Campaignアプリケーションで使用されます。
SQL名は、要素名と型に基づいて自動的に決定されます。
SQLの命名規則は次のとおりです。
  • 表: スキーマの名前空間と名前の連結
    この例では、 sqltable 属性のスキーマのメイン要素を介してテーブルの名前が入力されます。
    <element name="recipient" sqltable="CusRecipient">
    
    
  • フィールド: 型に従って定義されたプレフィックスが先頭に付く要素の名前(整数の場合は「i」、重複の場合は「d」、文字列の場合は「s」、日付の場合は「ts」など)。
    フィールド名は、入力された各およ <attribute> <element> :
    <attribute desc="E-mail address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/> 
    
    
SQL名は、ソース・スキーマからオーバーロードできます。 これを行うには、関連する要素に「sqltable」または「sqlname」属性を設定します。
拡張スキーマから生成されるテーブルを作成するSQLスクリプトは、次のとおりです。
CREATE TABLE CusRecipient(
  iGender NUMERIC(3) NOT NULL Default 0,   
  sCity VARCHAR(50),   
  sEmail VARCHAR(80),
  tsCreated TIMESTAMP Default NULL);

SQLフィールドの制約は次のとおりです。
  • 数値フィールドと日付フィールドにnull値がない。
  • 数値フィールドは0に初期化されます。

XMLフィールド

デフォルトでは、型指定された要素 <attribute> および <element> 要素は、データスキーマテーブルのSQLフィールドにマップされます。 ただし、このフィールドをSQLではなくXMLで参照することができます。つまり、データは、すべてのXMLフィールドの値を含むテーブルのメモ型フィールド("mData")に格納されます。 これらのデータのストレージは、スキーマ構造を監視するXMLドキュメントです。
XMLでフィールドにデータを埋め込むには、値が「true」の xml 属性を関連する要素に追加する必要があります。
: 次に、XMLフィールドの使用例を2つ示します。
  • 複数行コメントフィールド:
    <element name="comment" xml="true" type="memo" label="Comment"/>
    
    
  • HTML形式のデータの説明:
    <element name="description" xml="true" type="html" label="Description"/>
    
    
    「html」タイプを使用すると、HTMLコンテンツをCDATAタグに格納し、Adobe Campaignクライアントインターフェイスに特別なHTML編集チェックを表示できます。
XMLフィールドを使用すると、データベースの物理構造を変更することなく、フィールドを追加できます。 もう1つの利点は、使用するリソースが少ないことです(SQLフィールドに割り当てるサイズ、テーブルあたりのフィールド数の制限など)。
主な短所は、XMLフィールドのインデックス付けやフィルタリングが不可能であることです。

インデックス付きフィールド

インデックスを使用すると、アプリケーションで使用するSQLクエリのパフォーマンスを最適化できます。
データスキーマのメイン要素からインデックスが宣言されます。
<dbindex name="name_of_index" unique="true/false">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

インデックスは次の規則に従います。
  • インデックスは、テーブル内の1つ以上のフィールドを参照できます。
  • unique属性に値「true」が含まれている場合は、すべてのフィールドでインデックスを一意にする( 重複を避ける )ことができます。
  • インデックスのSQL名は、テーブルのSQL名とインデックスの名前から決定されます。
標準として、インデックスはスキーマのメイン要素から宣言された最初の要素です。
インデックスは、テーブルマッピング(標準またはFDA)中に自動的に作成されます。
  • 電子メールアドレスと市区町村にインデックスを追加する:
    <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>
    
    
  • 「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>
    
    

キーの管理

テーブルには、テーブル内のレコードを識別するためのキーが少なくとも1つ必要です。
キーがデータスキーマのメイン要素から宣言されます。
<key name="name_of_key">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

キーは次の規則に従います。
  • キーは、テーブル内の1つ以上のフィールドを参照できます。
  • キーは、値が入力されるスキーマ内で最初に存在する場合や、値が「true」の internal 属性が含まれている場合は、「primary」(または「priority」)と呼ばれます。
  • 一意のインデックスは、各キー定義に対して暗黙的に宣言されます。 値が「true」のnoDbIndex ​属性を追加すると、キーにインデックスが作成されるのを防ぐことができます。
標準として、キーは、インデックスが定義された後にスキーマのメイン要素から宣言された要素です。
テーブルのマッピング(標準またはFDA)中にキーが作成され、Adobe Campaignは一意のインデックスを検索します。
  • 電子メールアドレスと市区町村にキーを追加する:
    <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 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>
    
    
  • 「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 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>
    
    

自動増分キー

ほとんどのAdobe Campaignテーブルの主キーは、データベースエンジンによって自動生成される32ビットの長い整数です。 キー値の計算は、データベース全体で一意の数値を生成するシーケンス( XtkNewId SQL関数)によって決まります。 レコードを挿入すると、キーの内容が自動的に入力されます。
増分キーの利点は、テーブル間の結合に変更不可能な技術キーを提供することです。 また、このキーは重複バイトの整数を使用するので、メモリをあまり占有しません。
ソーススキーマで、pkSequence ​属性で使用するシーケンスの名前を指定できます。 この属性がソーススキーマに指定されていない場合、 XtkNewId デフォルトのシーケンスが使用されます。 nms:broadLog とnms:trackingLog スキーマ(NmsLogIdとMsTrackingLogIdは部分的なテーブルで最も多くのレコードが含まれるため 、各 は専用のシーケンスを使用します​ (NmsBroadLogIdと NmsTrackingLogId)。
ACC 18.10では、 XtkNewId は追加設定なしのスキーマ内のシーケンスのデフォルト値ではなくなりました。 これで、スキーマを構築したり、専用のシーケンスを使用して既存のスキーマを拡張したりできます。
新しいスキーマを作成するときや、スキーマ拡張の際には、スキーマ全体で同じプライマリキーシーケンス値(@pkSequence)を維持する必要があります。
Adobe Campaignスキーマ( NmsTrackingLogId など)で参照されるシーケンスは、SQL関数に関連付ける必要があります。この関数は、パラメーター内のIDの数をコンマで区切って返します。 この関数はGetNewXXXIds と呼ぶ必要があります。 XXXはシーケンスの名前です( 例えば、GetNewNmsTrackingLogIds )。 アプリケーションと共に提供される gres-nms.sql -nms.sql 、または oracle-nms.sql ファイルをdatakit/nms/eng/sql/directoryに表示し、各データベースエンジンの「NmsMsMssqlLogIdシーケンスの作成」の例を回復します。
一意のキーを宣言するには、データスキーマのメイン要素に autopk 属性(値「true」)を設定します。
ソーススキーマで増分キーを宣言しています:
<srcSchema name="recipient" namespace="cus">
  <element name="recipient" autopk="true">
  ...
  </element>
</srcSchema>

生成されたスキーマ:
<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>

キーとそのインデックスの定義に加えて、自動生成された主キーを含めるために、拡張スキーマに「id」という数値フィールドが追加されました。
プライマリ・キーが0に設定されたレコードは、テーブルの作成時に自動的に挿入されます。 このレコードは、外部結合を避けるために使用されます。外部結合はボリュームテーブルでは有効ではありません。 デフォルトでは、すべての外部キーは値0で初期化されるので、データ項目が入力されていない場合でも結合時に結果が常に返されます。