最简单的情况是 JDBC 对象类只包含一个(主)表。不存在从表,因此无需定义表之间的关系。
如果对象类包含多个表,则必须明确定义这些表之间的关系。表之间的关系始终在从表上进行定义。可以使用从表的以下属性定义这些关系:
is-single-row-table 指定 LDAP 条目在表中只有一个匹配行。
contains-shared-entries 指定从表中的一行由主表中的多个行使用。
filter-join-rule 表示应如何根据主表内容从从表中检索条目。
以下示例将说明如何根据前两个属性的值定义过滤器联接规则。这些示例假定对象类具有一个主表和一个从表。
以上是这些属性的默认值。在此案例中,主表和从表之间的关系为 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 操作的运行方式如下:
添加员工条目。如果员工条目中的经理在表中不存在,将创建一个新行。如果该经理存在,则使用现有行。
替换条目中 "manager" 属性的值。MANAGER.NAME 行的值将发生更改。
删除员工条目。从表中的行不会删除,因为经理条目为共享条目。
从条目中删除 "manager" 属性。从表中的行将被删除,并且外键 (EMPLOYEE.FK_MANAGER_ID) 被设置为 NULL。
在此案例中,主表和从表之间的关系为 1->1 或 1<-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。
在此案例中,主表和从表之间的关系为 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} |
目录代理服务器目前不支持此案例。