1. 主表/子表字段功能协议

字段类型 协议中我们了解到 主表/子表 字段是一种特殊的 相关表 字段,本协议着重描述“主表/子表”字段的特别之处,约定其功能规范。

功能特点

普通的 相关表 字段只是通过创建 主键/外键 关系,把两个对象关联起来,而“主表/子表”字段在些基础上更进一步,在两个对象之间建立了主从关系,基于这种主从关系它主要有以下功能特点。

页面布局

在主表/子表字段关系中的主表一侧,其关联对象的记录详细界面上,所有的子表对象会在底部依次显示为子表列表。

累计汇总

在主表/子表字段关系中的主表一侧,其关联对象上可以新建累计汇总字段,用于汇总对应的子表记录,对子表记录进行计数、求和、最大值、最小值或平均值汇总计算。

限制规则

在有些业务场景中,有可能会需要在单个对象上建立多个主子表关系字段,也可能会创建多层主子表关系链,比如合同对象下面有付款子表记录,而付款对象下面又有订单子表记录。

为了降低主子表关系带来的复杂性,以及保证系统整体性能的优良性,低代码平台需要实现以下限制规则的约定:

  • 一个对象上限制最多可以配置两个“主表/子表”字段,即一个对象往上最多可以从属于两个主表对象,但是一个对象往下允许配置多个子表对象。
  • 当对象本身就是其他对象的主表对象时,该对象下最多只能有一个“主表/子表”字段,即一个对象往下已经是其他对象的主表,往上又是其他对象的子表时,不再允许该对象成为另一个对象的子表了。
  • 对象上的主子表关系有层级限制,整个主子表关系链层级不允许超过3层,这里3层指的是 A-B-C-D,它们都有父子关系,A对象作为最顶层,其上不可以再创建主表子表字段,也不可以在整个链条底层或中间层任意位置加主子表关系造成整个链条层次超过3层。
  • 不允许创建指向自身的主子表关系,即对象新建“主表/子表”字段时不可以选择主表对象为自身。
  • 不允许创建重复的主子表关系,即在新建或编辑“主表/子表”字段时,不能选之前已经在该对象上建过的“主表/子表”字段上引用的相同对象。
  • 在一个多层主子表关系链中,一个对象只能出现一次,假设某个主子表关系链为 A-B-C-D,这是合法的主子表关系链,但是 A-B-A-DA-B-C-A 等就不是合法的主子表关系链了,因为 A 对象在整个关系链中出现了两次。
  • 在主子表关系链中的主表对象不允许被删除,但是子表对象可以被删除,也就是说要删除主表对象,必须先删除子表对象,相应的,还原对象时,必须先还原主表对象再还原子表对象。

首要及次要关系

按上述限制规则,一个对象上最多允许配置两个 “主表/子表” 字段,即一个子表对象最多只能同时从属于两个主表对象。

当一个对象上同时有两个主子表关系时,可以通过首要和次要关系来区分它们:

  • 在对象上创建的第一个“主表/子表”字段形成的主子表关系会成为首要关系。
  • 一个子表对象同时从属于两个主表对象时,这两个主表对象按其主子表关系创建的先后次序分别被称为首要主表对象和次要主表对象。

所有者同步规则

在低代码平台权限功能中,所有对象上都有一个名为 “所有者 owner” 的字段,该字段描述的是记录的所有权是谁,当用户没有对象记录的“查看全部”权限时,只能查看 owner 为自己的记录。

在主子表关系中,子表记录的 owner 始终会同步为其所属主表记录的 owner 值,这样子表记录的 “所有者” 权限就能始终与主表记录统一。

为了实现这种统一的所有者权限规则,低代码平台需要实现以下规范:

  • 不允许变更子表记录的 owner 值。
  • 根据主表记录自动维护其所属的所有子表记录的 owner 值。

当对象上同时存在两个主子表关系,或者多层级主子表关系时,低代码平台按以下规范处理所有者同步规则:

  • 对象记录会从其相关联的首要主记录继承 owner 字段的值,忽略其次要主记录的 owner 值。
  • 根据主表记录自动维护其下一层的所有子表记录的 owner 值,对于更深层的主子表关系链,不自动延伸处理其下一层子表记录。

子表权限规则

在“主表/子表”字段上有一个控制子表权限的开关属性 write_requires_master_read,该开关表示“当用户对主表记录有读取权限时对子表记录可以增删改”,默认情况下,只允许同时具有主表记录的读取和写入权限的用户创建、编辑和删除子表记录,勾选该属性后表示允许只有主表记录读取权限的用户创建、编辑或删除子记录。

当对象上同时存在两个主子表关系时,低代码平台按以下规范处理子表权限规则:

  • 子表的创建、编辑、删除权限取决于其与两个关联主表关系中 write_requires_master_read 属性配置,只有两个主子表关系中的配置都表明当前用户有权限时才有对应的权限。

比如对象M上配置了与A、B两个主表对象的主子表关系,A上配置的是只要有主表记录读取权限就能增删改,B上配置的是必须要有主表记录的读取和写入权限才能增删改,那么当前用户要想在A或B记录详细界面上创建、编辑、删除子表M的记录,必须至少同时有主表A记录的读取及主表B记录的读取和写入权限。

  • 子表的查看权限取决于当前用户是否对两个主表记录都至少有读取权限。

比如对象M上配置了与A、B两个主表对象的主子表关系,A的记录详细界面中是否显示M子表,取决于当前用户是否额外有主表B记录的查看权限。

累计汇总功能约束

当一个子表对象上同时存在两个主子表关系时,低代码平台按以下规范处理累计汇总功能:

该子表对象的两个主表对象上可以同时设置累计汇总字段对该子表对象进行汇总计算,也可以同时聚合该子表对象上的同一个字段,并且支持所有汇总类型的计算。

比如对象M上配置了与A、B两个主表对象的主子表关系,可以在主表对象A和B上同时配置对子表M进行各种汇总计算的汇总字段,并且它们可以对子表M上的同一字段进行聚合汇总。

当对象上存在多层级主子表关系时,低代码平台按以下规范处理累计汇总功能:

不可以跨层级进行累计汇总计算,比如 A-B-C 这种主子表关系链中的主表对象A上不可以直接配置对子表对象C进行汇总计算的汇总字段,只能配置对其直属下级子表对象B进行汇总计算的汇总字段。

参考: