Sun Java System Directory Server Enterprise Edition 6.3 管理指南

定义 JDBC 表之间的关系

最简单的情况是 JDBC 对象类只包含一个(主)表。不存在从表,因此无需定义表之间的关系。

如果对象类包含多个表,则必须明确定义这些表之间的关系。表之间的关系始终在从表上进行定义。可以使用从表的以下属性定义这些关系:

以下示例将说明如何根据前两个属性的值定义过滤器联接规则。这些示例假定对象类具有一个主表和一个从表。


示例 23–1 is-single-row-table:true contains-shared-entries:true

以上是这些属性的默认值。在此案例中,主表和从表之间的关系为 n->1,也就是说,主表中的 n 个行将引用从表中的一个共享行。

在关系数据库中,外键 (foreign key, FK) 在主表中定义,它指向从表的某个列。

例如,在某个组织中,一位经理可以管理多名员工。定义了两个关系数据库表,结构如下:


primary table : EMPLOYEE [ID, NAME, FK_MANAGER_ID]
secondary table : MANAGER  [ID, NAME]

定义了以下对象类和属性:


object-class : employee
attr : name (from primary EMPLOYEE.NAME)
attr : manager (from secondary MANAGER.NAME)

在从表中定义了以下过滤器联接规则:


ID=\${EMPLOYEE.FK_MANAGER_ID}"

如果存在多个从表,则必须为每个从表配置 filter-join-rule。有关如何为多个从表配置 filter-join-rule 的详细信息,请参见步骤 11

在此配置下,LDAP 操作的运行方式如下:



示例 23–2 is-single-row-table:true contains-shared-entries:false

在此案例中,主表和从表之间的关系为 1->11<-1,也就是说,从表中的一行将引用主表中的一行。

在关系数据库中,外键 (foreign key, FK) 可能在主表中定义,也可能在从表中定义。

例如,在某个组织中,员工的 UID 存储在一个表中,其姓氏存储在另一个表中。定义了两个关系数据库表,结构如下:


primary table : UID [ID, VALUE, FK_SN_ID]
secondary table : SN [ID, VALUE]

定义了以下对象类和属性:


object-class : employee
attr : uid (from primary UID.VALUE)
attr : sn (from secondary ID.VALUE)

在从表中定义了以下过滤器联接规则:


ID=\${UID.FK_SN_ID}

此配置也可能是另外一种方式,即外键 FK_UID_ID 存储在从表中,并指向 UID.ID



示例 23–3 is-single-row-table:falsecontains-shared-entries:false

在此案例中,主表和从表之间的关系为 1->n,也就是说,从表中的 n 个行将引用主表中的一行。此示例说明了多值属性的情况。多值属性在从表中以一组行表示,每个属性值为一行。

在关系数据库中,外键在从表中定义,它指向主表中的某个列。

例如,在某个组织中,员工可以有多个电话号码。定义了两个关系数据库表,结构如下:


primary table : EMPLOYEE [ID, NAME]
secondary table : PHONE [ID, VALUE, USER_ID]

定义了以下对象类和属性:


object-class : employee
attr : cn (from primary EMPLOYEE.NAME)
attr : telephoneNumber (from secondary PHONE.VALUE)

在从表中定义了以下过滤器联接规则:


USER_ID=\${EMPLOYEE.ID}


示例 23–4 is-single-row-table:falsecontains-shared-entries:true

目录代理服务器目前不支持此案例。