架构中的密钥管理 management-of-keys
与数据模式相关联的每个表必须具有至少一个用于标识表中记录的键。
从数据架构的主元素中声明了一个键。
<key name="name_of_key">
<keyfield xpath="xpath_of_field1"/>
<keyfield xpath="xpath_of_field2"/>
...
</key>
如果某个键是架构中第一个要填充的键,或者包含设置为“true”的internal
属性,则该键被称为“主键”。
以下规则适用于键:
- 键可以引用表中的一个或多个字段
- 为每个键定义隐式声明唯一索引。 通过将
noDbIndex
属性设置为“true”,可以阻止在键上创建索引。
-
作为标准,键是在定义索引后从架构的主元素声明的元素。
-
键是在表映射(标准或FDA)期间创建的,Adobe Campaign查找唯一的索引。
示例:
-
向电子邮件地址和城市添加密钥:
code language-sql <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="Email address of recipient"/> <element name="location" label="Location"> <attribute name="city" type="string" length="50" label="City" userEnum="city"/> </element> </element> </srcSchema>
生成的架构:
code language-sql <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="Email 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”名称字段中添加主键或内部键:
code language-sql <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="Email address of recipient"/> </element> </srcSchema>
生成的架构:
code language-sql <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="Email address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/> </element> </schema>
自动增量键 auto-incremental-key
大多数Adobe Campaign表的主键是由数据库引擎自动生成的32位长整数。 键值的计算取决于序列(默认情况下,XtkNewId SQL函数),该序列生成的数字在整个数据库中是唯一的。 在插入记录时自动输入密钥的内容。
增量键的优点在于,它为表之间的连接提供了不可修改的技术键。 此外,此键不会占用太多内存,因为它使用双字节整数。
您可以在源架构中指定要与 pkSequence 属性一起使用的序列的名称。 如果源架构中未提供此属性,则将使用 XtkNewId 默认序列。 应用程序对 nms:broadLog 和 nms:trackingLog 架构使用专用序列(分别为 NmsBroadLogId 和 NmsTrackingLogId),因为这些是包含最多记录的表。
从ACC 18.10开始,XtkNewId 不再是现成架构中序列的默认值。 您现在可以使用专用序列构建模式或扩展现有模式。
在Adobe Campaign架构中引用的序列(例如 NmsTrackingLogId)必须与返回参数中ID数的SQL函数关联,并以逗号分隔。 此函数必须调用 GetNew XXX Ids,其中 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”的数字字段,以包含自动生成的主键。