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欄位約束如下:
  • 數值和日期欄位中沒有空值,
  • 數字欄位會初始化為0。

XML欄位

預設情況下,任何類 <attribute> 型和 <element> 元素都映射到資料模式表的SQL欄位。 但是,您可以在XML中引用此欄位,而不是SQL,這表示資料儲存在包含所有XML欄位值的表的備注欄位(「mData」)中。 這些資料的儲存是一份XML檔案,可觀察架構結構。
若要在XML中填入欄位,您必須將 xml 屬性的值"true"新增至相關元素。
範例 : 以下是兩個XML欄位使用範例。
  • 多行注釋欄位:
    <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欄位可以添加欄位,而無需修改資料庫的物理結構。 另一個優勢是,您使用的資源較少(分配給SQL欄位的大小、每個表的欄位數限制等)。
主要缺點是無法對XML欄位進行索引或篩選。

索引欄位

索引可以優化應用程式中使用的SQL查詢的效能。
從資料模式的主元素中聲明索引。
<dbindex name="name_of_index" unique="true/false">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

索引遵循下列規則:
  • 索引可以引用表中的一個或多個欄位。
  • 如果唯一屬性包含值"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>
    
    

密鑰管理

表必須至少有一個用於標識表中記錄的鍵。
從資料模式的主元素中聲明密鑰。
<key name="name_of_key">
  <keyfield xpath="xpath_of_field1"/>
  <keyfield xpath="xpath_of_field2"/>
  ...
</key>

鍵符合下列規則:
  • 鍵可以引用表中的一個或多個欄位。
  • 當索引鍵是架構中第一個要填入的索引鍵,或者包含內部屬性,且值為「 true 」時,該索引鍵稱為「primary」(或「priority」)。
  • 每個索引鍵定義都隱式聲明一個唯一索引。 通過將noDbIndex屬性添加為值"true",可 ​以防止在鍵上建立索引。
作為標準,鍵是在定義索引後從架構的主要元素聲明的元素。
索引鍵是在表格對應(標準或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 預設序列。 應用程式對 :broadLog :trackingLog 架構( BroadLogId ​TrackingLogId nms)使用專用序列,因為這些表包含最多記錄。
從ACC 18.10開始, XtkNewId 不再是現成可用結構中序列的預設值。 您現在可以建立架構,或使用專用序列擴充現有架構。
建立新模式或在模式擴展期間,需要為整個模式保留相同的主鍵序列值(@pkSequence)。
Adobe Campaign架構中參考的序列(例如​ NmsTrackingLogId )必須與SQL函式關聯,該函式會傳回參數中以逗號分隔的ID數。 此函式必須稱 為GetNewXXXIds ,其中 XXX 是序列的名稱(例如​ GetNewNmsTrackingLogIds )。 查看隨 應用程式提供在 datakit/nms/eng/sql/目錄中的 postgres-nms.sql mssql-nms.sql oracle-nms.sql 檔案,以恢復為每個資料庫引擎建立「NmsTrackingLogId」序列的示例。
若要宣告唯一索引鍵,請在資 料結構的主要元素上填入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初始化,以便在未填充資料項時,始終可以在連接時返回結果。