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'など)。
    フィールド名は、入力された各フ ィールドのsqlname 属性を使用して入力 <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でフィールドにデータを入力するには、 xml 属性に値「true」を指定して、関連する要素に追加する必要があります。
: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 」の内部属性が含まれる場合、キーは「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:trackingSchemas( NmsBroadLogIdとMsBroadLogId LogLogLog )に対してシーケンスを使用します。これは、最も多くのレコードを含む専用のテーブル​ であるからです。
ACC 18.10からは、 XtkNewIdは 、あらかじめ用意されているスキーマのシーケンスのデフォルト値ではなくなりました。 これで、スキーマを作成したり、専用のシーケンスを使用して既存のスキーマを拡張したりできるようになりました。
新しいスキーマを作成するときや、スキーマ拡張の際には、スキーマ全体で同じプライマリキーシーケンス値(@pkSequence)を維持する必要があります。
Adobe Campaignスキーマ( NmsTrackingLogIdなど )で参照されるシーケンスは、SQL関数に関連付ける必要があります。この関数は、パラメーター内のIDの数をコンマで区切って返します。 この関数はGetNewXXXIdsと呼ばれ る必要があります XXXはシーケンスの名前です( 例: GetNewNmsTrackingLogIds )。 各データベースエンジンの ​NmsLogIdシーケンス作成例をリカバリするには、 datakit/ms/eng/sql/posttrackingディレクトリ内の、アプリケーションと共に提供されるgres-nms.sql oracle-nms.sql、またはoracle-nms.sqlを表示します。
一意のキーを宣言するには、 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で初期化され、データ項目が入力されていない場合に結果を常に結合時に返すことができます。