上一期我们学习了 Dataverse 中列的不同类型,在本期我们将学习多个表之间的关系。
一对多关系
Dataverse 提供的是关系型数据库,里面存放着一张一张的表,只不过各表之间是有联系的。
我们以下图中的学生表和成绩表为例,向大家说明之间的关系。
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647504915-349536-4a5732533062c12eb4edf0417896ade6.png)
可以发现学生表和成绩表通过学号关联了起来,我在上图中用相同的颜色代表了同一个学生的信息。
比如我想要知道学生表里学号是 0001的成绩,那我就可以在成绩表里查找“学号”等于 0001 的行,最后会发现成绩表里有 3行都是0001,对应的就是该学生三门课程的成绩。
这就是数据库中的一对多关系,一名学生有多个课程成绩,但是一个成绩只属于那一名学生,而反过来就叫多对一关系。
那在 Dataverse 中要怎么设置多对一关系呢?
这就需要用到我们上期提到的“查找”列。
我们在成绩表(主表/父表)中添加一个叫做学号的列,并将列的类型设置为查找,这时候在相关表中选择“学生”表(相关表/子表),就相当于在成绩表和学生表之间建立了多对一的关系(反过来学生表和成绩表之间就是一对多的关系,一对多关系和多对一关系本身是同一个概念)。
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647504942-338824-85169b460b9893ba44f34ed1355450e9.png)
一旦添加完查找列之后,在编辑或创建成绩记录时就会呈现出一个叫做“学号”的下拉列表。用户可以从中选择要与之关联的行。
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647504956-976459-3818a6c01694e7b88976393ca748c539.png)
比如我这里就是将80分的成绩与学号0001的学生进行了关联。
当我们在两个表之间创建关系后,就会引发另外一个概念:级联行为
级联行为决定了对主表中的记录进行某些操作时,这些操作是否也要应用到相关表的记录上。
比如我要删除一个学生信息,那与他相关联的成绩数据会发生什么,是将相关数据全部删除,还是仅仅将查找列删除,又或者直接禁止删除学生信息。这些就是通过级联行为决定的。
Dataverse 中有以下操作会触发级联行为
分配:一个主表的记录被分配
共享:主表中的记录被共享
取消共享:主表中的记录被取消共享
删除:主表中的记录被删除
重新设置父级:相关表的记录关联到主表中的记录,或重新关联到其他表的记录
其中分配、共享、取消共享和重新设置父级这些操作支持四种级联行为:
全部级联:会对所有相关记录执行操作
级联活动:对所有状态为活动的相关记录执行操作
级联用户拥有的内容:对被主要记录的用户所负责的所有相关记录执行操作
无级联:不对相关记录执行任何操作
而删除操作支持三种级联行为:
全部级联:当删除主记录后,会同步删除该关系下的全部相关记录
删除链接:当删除主记录后,会删除相关表的查找列,但整体记录会保存在系统中,但不会再通过此关系记录关联
限制:当删除主记录时,如果在该关系下存在相关记录,则会阻止主记录的删除操作。
基于以上几种操作和对应的级联行为,Dataverse 内置了四种行为类型:
行为类型我们可以理解为是,设置操作如何对应级联行为的模板
父级:所有的操作都使用全部级联行为,比如删除一个学生时,会将该学生所有的成绩记录删除。
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647504982-834352-b218d123469df24b88d59012797dcc6e.png)
引用,删除链接:分配、共享、取消共享和重新设置父级操作使用无级联行为,删除操作使用删除链接行为。也就是只有在删除学生信息时,会将相关成绩的查找列删除。在其他操作时,不会对成绩表执行任何操作。
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647504998-774860-da5d7f9a716be1d79b70bd78a67fce36.png)
引用,限制删除:删除操作使用的是限制行为,其他操作和引用行为一致。比如在删除学生时,如果该学生存在成绩,就不允许删除。其他操作不会对成绩表执行任何操作。
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647505014-361713-8993eb6921fbb255df365d52e9fb545b.png)
自定义:可以为每个操作单独设置不同的级联行为
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647505024-209303-6bc55b7bd198ad9f93127d74c07f4a37.png)
多对多关系
以上的内容都是建立在一对多的关系之上,而在 Dataverse 中还提供了原生的多对多关系支持。
比如一个学生可以选择多门课程,一门课程也有多名学生上课,这种就叫做多对多关系。
当我们创建了两个表之间的多对多关系时,系统会创建一个隐藏的关系表(中间表),这个关系表无法在系统中看到,也不能修改。这个关系表与前后两个多对多关系的表各自存在一个一对多关系。(也就是说多对多关系,是通过两个一对多关系组成的)。
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647505037-702675-5151c008b9a7a9ec981065c553326210.png)
因此除了系统提供的多对多关系以外,我们也可以手动创建一个自定义的关系表(中间表),并且将该表与另外两个表建立一对多关系。从而实现自定义的多对多关系。比如在学生表和课程表之间建立一个选课表,在选课表中建立学生表和课程表的查找列,从而实现学生表和课程表的多对多关系。
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647505046-268430-1be754a909e8be92d7acb89e1a0ed2f8.png)
这种方法的好处是,我们可以查看关系表(中间表)的记录,并且可以在关系表中添加一些有用的列。
若使用系统提供的原生多对多关系,我们只能知道一个学生参加了哪些课程,或者一个课程有哪些学生参加了。这时如果我们创建了一个自定义的关系表(选课表),就可以在其中添加一些其他列,用来记录学生在上课时的一些额外信息。
自引用一对多关系
我们前面提到的一对多关系和多对多关系都可以存在于同一张表之间。也就是同一张表的记录之间也会存在一对多关系/多对多关系。
常见的是同一实体的一对多关系,比如账户表里有一个为名父账户的查找列。它链接的是账户表本身。这样就会形成相关记录的自引用一对多关系,这个时候可以开启一个层次结构的功能。
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647505065-495498-1f7db83242e9a36cf757291bec3ed030.png)
通过层次结构系统可以更好的可视化分层数据
![](https://forum.power-platform.cn/assets/files/2022-03-17/1647505076-694555-c441e1e90f5151ee71598726af492109.png)
表的映射
另外基于一对多关系,系统还可以形成表的映射。比如我们有一个客户记录,有许多联系人记录与该客户关联,当我们直接从客户上新建联系人时,我们希望将客户的地址,电话等数据直接填充到正在创建的联系人记录上。这种表的映射可以更加方便的使用父记录的信息,快速填充已定义的列。
本期重点:
一对多关系和多对多关系的说明
级联行为决定了对主表中的记录进行某些操作时,这些操作是否也要应用到相关表的记录上
通过表的映射可以快速填充相关表的记录数据