CDS view Association 引入的缘由
CDS 视图不会被业务用户直接访问,而是会被 ABAP 程序、Fiori 应用程序或 BI 前端工具使用。假设在 5 个不同的表上使用 JOINS 创建了 CDS 视图,则每次触发此 CDS 视图时都会执行此 JOIN 条件。即使业务用户只查看 2 个表中的字段,但 CDS 视图将首先运行所有 5 个表的连接条件,并且用户查看的字段数量无关紧要。 这种基于 JOIN 的 SQL 概念,在用户仅查看部分数据的情况下,会导致从 CDS 视图中提取数据的性能延迟。 为了克服这个问题,SAP 对这种获取数据的 SQL 方式进行了增强,引入了 Association的概念。
association 也是一种 join,可以根据 join 条件从多个表中获取数据,但这些是按需连接,即它们只会在用户访问所需数据时触发。 例如 CDS 视图配置了 4 个关联,而用户仅获取 2 个表的数据,其他 2 个表上的关联将不会被触发,系统将快速返回结果。因此同常规 SQL JOINS 相比,association 的性能更优。
INNER JOIN 和 Association 的区别
INNER JOIN场景下表 Join 一定会发生,无论被 Join 的表的字段在当前事务里是否会被读取,这造成了不必要的性能开销。Association场景下只有查询用到Association的表时才会关联(left outer join)。
`
Association中的Cardinality
基数Cardinality是源表和关联表(或CDS视图)之间的关系,它以[MIN …MAX]的形式包含在关联的定义中。(只声明了目标基数)。它主要用于记录数据模型的语义。它不会在运行时进行验证,但会产生语法检查警告。
注意:仅为目标(关联的)表/视图定义基数。[0 . .1] =表示目标的基数可以是0或1。同样[0 . .N]表示目标表/视图基数可以从0到N。 ..的两边并不是源表和关联表的数量。
在关键字关联之后指定基数,但它并不是必需显式定义的。如果没有显式定义基数,则有一个隐式的基数[0..1]。