Microsoft Dataverse 中的表关系定义表行可以与其他表或同一表中的行关联的方式。 有两种类型的表关系:
一对多关系
在一对多的表关系中,多个引用(相关)表行可与单个引用(主要)表行相关联。 被引用的表行有时也称为“父项”,而引用表的行则称为“子项”。 多对一关系是一对多关系的所属角度。
例如,在学校情境中,多个课程可能在一个教室中进行,因此班级表与课程表有一对多的关系。
多对多关系
在多对多表关系中,许多表行可以与其他许多表行相关联。 可以将使用多对多关系关联的行视为对等,并且关系是相互的。
例如,在前面提到的同一学校方案中,单个学生可以注册多个课程,每个课程可以有多个学生。 这种类型的关系允许更复杂的数据关联,并使用 Dataverse 中的 Power Apps 进行管理。
关系在 Dataverse 中的工作原理
表关系定义如何在 Dataverse 中相互关联表行。 在最简单的层面上,向表中添加查找列将在两个表之间创建新的 1:N(一对多)关系,并使您能够将该查找列放置在窗体中。 借助查阅列,用户可以将该表的多个 子 行关联到单个 父 表行。
除了简单地定义行如何与其他行相关之外,1:N 表关系还提供数据来解决以下问题:
- 删除行时,是否还应删除与该行相关的任何行?
- 分配行时,是否还需要向新所有者分配与该行相关的所有行?
- 如何在现有行的上下文中创建新的相关行时简化数据输入过程?
- 人们在查看某一行时,应如何查看与之关联的行?
表还可以参与 N:N(多对多)关系,其中两个表的任意数量的行都可以彼此关联。
决定是使用表关系还是连接
表关系是促成 Dataverse 中更改的元数据。 这些关系允许查询高效地检索相关数据。 使用表关系可以定义能定义表或者大多数行可以使用的正式关系。 例如,没有潜在客户的机会将不起作用。 Dynamics 365 for Sales 中的商机表与竞争对手表存在 N:N 关系(该表同样可在 Dynamics 365 for Sales 中使用)。 这允许将多个竞争对手添加到机会中。 你可能想要捕获此数据并创建显示竞争对手的报表。
行之间还有其他不太正式的关系类型,这些关系称为 连接。 例如,知道两个联系人是否结婚,或者他们可能是工作之外的朋友,或者一个联系人可能以前为另一个账户工作过,这可能很有用。 大多数企业不会使用此类信息生成报告或要求输入报表,因此创建表关系可能不值得。 详细信息: 配置连接角色
表关系的类型
在 Power Apps 中查看关系时,你可能会认为有三种类型的表关系。 实际上只有两个,如下表所示。
| 关系类型 | Description |
|---|---|
| 1:N (一对多) | 一种表关系,由于相关表上的查找列,主表的一个表行可以与其他很多相关表行关联。 查看主表行时,可以看到与其关联的相关表行的列表。 在 Power Apps 门户中, 当前表 表示主表。 |
| N:N (多对多) | 依赖于一种特殊的关系表(有时称为交叉表)的表关系,允许一个表的许多行与另一个表的许多行相互关联。 在 N:N 关系中查看任一表的行时,可以看到与它相关的其他表的任何行的列表。 |
用户界面中存在 N:1(多对一) 关系类型,因为设计器显示按表分组的视图。 1:N 关系实际上存在于各个表格之间,并将每个表格称为 主表/当前表 或 相关表。 相关表(有时称为 子 表)具有一个查找列,该列允许存储对主表中行的引用,有时称为 父 表。 N:1 关系只是从相关表角度来看的 1:N 关系。
表关系行为
相关表的操作非常重要,因为它们有助于确保数据完整性,还可以自动化您的业务流程。
保持数据完整性
某些表存在以支持其他表。 它们本身没有意义。 它们通常具有必需的查找列来链接到它们所支持的主表。 删除主行时会发生什么情况?
可使用关系行为根据业务的规则定义对相关行的影响。 详细信息: 添加高级关系行为
自动化业务流程
假设你有一个新的销售人员,并且你想要为他们分配一些当前分配给另一名销售人员的现有帐户。 每个客户行可能关联多个任务活动。 可以轻松找到要重新分配的活动帐户,并将其分配给新的销售人员。 但是,对于与这些客户关联的任何任务活动,会发生什么情况? 是否要打开每个任务,并确定是否还应将其分配给新的销售人员? 也许不是。 相反,你可以让这个关系自动为你应用一些标准规则。 这些规则仅适用于与您正在重新分配的账户相关联的任务行。 你的选项包括:
- 重新分配所有活动任务。
- 重新分配所有任务。
- 不要重新分配任何任务。
- 重新分配当前分配给账户前所有者的所有任务。
关系可以控制对主要表行的行执行的操作如何向下级联到所有相关表行。
Behaviors
当某些操作发生时,可以应用多种不同类型的行为。
| 行为 | Description |
|---|---|
| 级联活动项 | 对所有激活的相关表行执行操作。 |
| 全部级联 | 对所有相关表行执行动作。 |
| 无层叠 | 不执行任何操作。 |
| 删除链接 | 删除所有相关行的查找值。 |
| 限制 | 当相关表行存在时,防止删除主表行。 |
| 级联用户拥有 | 对作为主表行由相同用户负责的所有相关表行执行操作。 |
行动
这些操作可以触发某些行为:
| 列 | Description | 选项 |
|---|---|---|
| 分派 | 当主表行被分配给其他人时,会发生什么? | 全部级联 级联活动项 用户负责项的级联 无级联 |
| 重定父级 | 当家长关系中相关表的查找值发生更改时,会发生什么情况? 详细信息: 父表关系 |
全部级联 级联活动项 用户负责项的级联 无级联 |
| 共享 | 主表行被共享时会有什么变化? | 全部级联 级联活动项 用户负责项的级联 无级联 |
| 删除 | 删除主表行时会发生什么情况? | 全部级联 取消文章链接 限制 |
| 取消共享 | 当主表行取消共享时,会发生什么情况? | 全部级联 级联活动项 用户负责项的级联 无级联 |
| 合并 | 合并主表行时会发生什么情况? | 全部级联 无级联 |
| 汇总视图 | 与此关系关联的汇总视图的预期行为是什么? | 全部级联 可用项的级联 用户负责项的级联 无级联 |
注释
在以下情况下,分配、删除、合并和重新父级操作将无法执行:
- 如果原始父行和请求的操作包含相同的值。 示例:尝试触发分配操作时,选择的联系人已是该记录的当前所有者。
- 尝试对已运行级联操作的父记录执行操作。
执行分配时,当记录发生重新分配,当前在该记录上运行的任何工作流或业务规则都会自动停用。 新记录所有者若需继续使用该工作流或业务规则,必须重新激活它。
父表关系
每对有资格形成 1:N 关系的表之间可以存在多个 1:N 关系。 但通常只能将其中一个关系视为父表关系。
父表关系是下表的父列中的级联选项之一为 true 的任何 1:N 表关系。
| Action | 父子关系 | 非父 |
|---|---|---|
| 分派 | 全部级联 用户负责项的级联 级联活动项 |
无级联 |
| 删除 | 全部级联 | RemoveLink 限制 |
| 重定父级 | 全部级联 用户负责项的级联 级联活动项 |
无级联 |
| 共享 | 全部级联 用户负责项的级联 级联活动项 |
无级联 |
| 取消共享 | 全部级联 用户负责项的级联 级联活动项 |
无级联 |
例如,如果您新建一个自定义表并添加与客户表的 1:N 表关系(其中自定义表是相关表),则可以将该表关系的操作配置为使用父列中的选项。 如果您后来添加了自定义表作为引用表的另一个 1:N 表关系,则只能将操作配置为使用非父列中的选项。
通常这意味着,对于每个表对,只有一个父关系。 在某些情况下,对相关表的查找可能允许与多个类型的表建立关系。
例如:若某表格的客户查找字段可关联联系人表或账户表。 有两个单独的父 1:N 表关系。
对于可使用相关项查找列进行关联的表,任何活动表都具有一组类似的父表关系。
可以设置的行为限制
由于父母关系存在一些限制,因此在定义表关系时,应牢记这一点。
- 在与级联的相关系统表的关系中,自定义表不能为主表。 这意味着,不能在主自定义表与相关系统表之间设置为 Cascade All、Cascade Active 或 Cascade User-Owned 的任何操作上建立关系。
- 如果在某个关系中的相关表已经在另一个关系中作为相关表存在,并且该关系的任何操作设置为 Cascade All、Cascade Active 或 Cascade User-Owned,则任何新建关系不能将任何操作设置为 Cascade All、Cascade Active 或 Cascade User-Owned。 这将防止创建具有多个父级的关系。
继承的访问权限清理
当您要跨相关表提供对行的访问权限时,使用重定父级和共享级联行为会很有用。 但是,流程或设计可能会发生更改,这需要更改级联行为设置。
当表关系使用 Reparent 或 Share,并且级联行为更改为 Cascade None 时,表关系将阻止任何新的权限更改从级联到相关子表。 此外,还必须撤消级联行为处于活动状态时授予的继承权限。
继承的访问权限清理是一个系统作业,用于清理在级联行为更改为 Cascade None 之后保留的旧继承访问权限。 此清理不会影响直接授予对表访问权限的任何用户,但只会从任何通过继承接收访问权限的用户中删除访问权限。
继承访问权限清理的工作原理如下:
- 识别和收集与更新后的父级具有级联关系的所有表。
- 标识并收集通过继承获得对相关表访问权限的用户。
- 检查被授予对相关表的直接访问权限的用户,并将其从集合中删除。
- 删除收集的表上收集的用户的继承访问权限。
清理程序运行后,那些仅因为级联功能而能够访问相关表的用户将无法再访问这些行,从而确保更高的安全性。 在某些情况下,清理可能无法成功。 详细了解如何清理继承的访问