HANA CDS与ABAP CDS
如果你在网络或者SCN上面搜索CDS,即SAP的Core Data Services,你会很容易地找到类似“Core Data Services(CDS)是一个在SAP HANA中用于定义和消费富语义数据模型的基础设施”这样的句子。在另一方面,在ABAP字典中似乎也有一种叫做ABAP CDS的东西。它们有什么关系?让我们从ABAP(还有ABAP CDS)文档的作者的视角中看看这个问题。
原文标题:CDS – One Concept, Two Flavors
本文链接:http://www.cnblogs.com/hhelibeb/p/6647324.html
我翻译的ABAP CDS教程:http://www.cnblogs.com/hhelibeb/tag/abap%20cds/
ABAP字典
为了开发应用,你需要有个东西来为数据建模。多年来,在ABAP的世界里,这意味着为了实现这个目的需要在ABAP应用服务器将ABAP字典作为建模工具。ABAP字典曾经是、现在也是一种平台无关的数据库表和视图的元数据存储库,并且可以在ABAP中通过OPEN SQL访问。数据库实体的定义由基于表单的ABAP字典工具处理,该过程发生在应用服务器,而相关的DDL(数据定义语言)经由DBI(数据库接口)被传递到数据库。你可以通过在SE11查看“数据库对象”查看。例如,对于视图,你可以看到相关的“CREATE VIEW”的DDL语句。对于ABAP程序来说,在ABAP字典中定义的实体充当着全局类型的角色,使得在ABAP中声明数据对象作为目标或者作为OPEN SQL中的DML(数据操纵语言)语句源变得简单起来。
HANA CDS
SAP HANA的到来,使得直接在数据库中开发应用成为了可能,这种开发不需使用应用服务器。这样也就产生了一个新需求:直接在数据库创建元数据模型存储库。因为在使用应用服务器上面的ABAP字典的时候,更多的是在UI上操作而不是使用原生SQL的CREATE TABLE和CREATE VIEW,特别是在有关在语义上进行纯技术定义的需求(?)。这就是SAP的Core Data Service存在的主要原因。
Core Data Service提供了一个基于SQL的DDL规范,通常可以在不同的平台上实现更多的可能性,比如注解/关联(annotations/associations)。在SAP HANA上,CDS提供了“定义数据持久化模型的构件”。CDS的DDL允许你通过包装相关的原生HANA SQL来定义数据库表,数据库视图、数据类型,并且通过语义属性增强它们。如果从ABAP程序员的视角来看,也许会有人说:好吧,这是一个直接作用于HANA数据库的基于源代码的字典工具。不过这样说就太短视了。
ABAP CDS vs. HANA CDS
有了ABAP CDS和HANACDS,我们就有了基于同一规范的两个实现。这两者是十分相似的,但是并不100%等同。如果你知道CDS的DDL,你应当可以理解两种不同风格下的CDS实体的定义。但是在规则上,你并不能从ABAP不加修改地复制DDL源放到HANA上,反之亦然。HANA CDS的实现和ABAP CDS的实现正在以不同的优先级推进。这就是为什么像“New Core Data Services Features in SAP HANA 1.0 SPS 10”这样的的博客会面向直接在SAP HANA上工作的开发者。ABAP开发者们则不得不在“ABAP News”这样的博客里寻找相关内容。
另一方面,由于HANA CDS只作用在SAP HANA上,ABAP CDS则是开放的,因此,ABAP CDS中存在着某些在HANA CDS中不存在的限制(出于同样的原因,OPEN SQL也比原生SQL的限制更多)。内建函数就是个好例子。ABAP CDS中的像CURRENCY_CONVERSION一样的内建函数必须在任何数据库平台可用,并且——这点非常重要——必须在所有平台有相同的表现。表达式也是这样,比如算术表达式,聚合或者CAST表达式。在ABAP CDS中想要发布这样的一个功能,必须让所有的平台都加进去。这是多么大的一个任务!而且这也是ABAP CDS至今不能提供SAP HANA的所有SQL功能的原因(但是这项工作还在进行...)。另一方面,它是开放的!因此也有某些ABAP特性例如客户端处理、表缓存目前在HANA CDS中不可用,但是在ABAP中可以使用。
(译者注:在ABAP 7.53后,Open SQL更名为ABAP SQL,未来将在某些方面只支持HANA而不支持各种其它数据库)
结论
SAP的Core Data Services提供了一个单一的数据建模基础架构的概念,它在SAP HANA和ABAP应用服务器中都得到了实现。两个实现的设计原理是相同的,不过由于各自所在的环境不同也有一些不同,它们的风格也自然有所不同。
注意
据我所知,至今还没有一个SAP HANA之外的数据库平台原生实现了CDS。为了在其他数据库中建模,你当然可以在ABAP字典中使用ABAP CDS,然后让它把模型交给你。
Introduction to CDS on HANA and ABAP part 1
ABAP on SAP HANA. Part IV. Core Data Services
Q & A
什么时候需要CDS?
这取决于可重用性。 如果是只需要一次的功能,则无需创建CDS视图。 我们可以在Open SQL中使用Joins,SQL表达式,子查询等方式来进行此代码下推。 但是如果我们想要重用一个视图,需要超过Open SQL的CDS的语义或技术能力(SAP试图让二者拥有相同的能力,但Open SQL的进展可能会稍慢)或者我们只想将完整的数据模型下推数据库,则需要CDS。
ABAP CDS和HANA CDS各自的使用场景?
如果你独立运行SAP HANA,或者是side-by-side场景(顶部没有ABAP栈),则无法使用ABAP CDS,必须使用HANA CDS。
如果HANA数据库之上有一个ABAP栈(ABAP应用服务器使用HANA数据库作为主数据库),那么:
i)如果要用Open SQL访问CDS entity,或者把它作为类型使用,或者如果要在ABAP中使用CDS注解,则必须使用ABAP CDS。
ii)如果不想通过ABAP访问CDS entity,但想要像ABAP开发对象一样传输和升级它们,则可以使用ABAP CDS。
iii)如果部用Open SQL访问CDS entity,并且不想把它作为类型使用,则可以使用HANA CDS,它与SAP HANA的集成更好。 但是,只能使用Native SQL(ADBC,AMDP)等方式从ABAP进行访问。
如何查找系统内全部的CDS视图?
查看搜索TADIR,从中查询PGMID = 'R3TR', OBJECT = 'DDLS'的条目。
可以看到它们所属的包,也可以在ADT中看到DDL源代码。
也可以查看表DDLDEPENDENCY,它包含所有DDL源的名字和CDS entity的名字。
在SE11中可以根据视图名看到字段定义。
CDS的突出优点都有哪些?
1. 语义丰富的数据模型
2. 领域特定语言(DDL,QL,DCL)
3. 声明式,接近概念性思维
4. 完全基于SQL
5. 可直接在CDS中使用“标准SQL”功能(如连接,联合,内置函数)
6. 兼容各种数据库
7. 生成和管理的SQL视图
8. SAP HANA中的本机集成
9. 可以作为不同特定领域框架的共同基础,例如 UI,Analytics,Odata,BW。
10. 代码下推
11. 表函数
12. 丰富的内置SQL函数
13. 可扩展
14. 模型级别上的扩展
15. 元模型层面上的注释
16. 可测试
ABAP CDS比Open SQL(ABAP SQL)更快吗?
并不,虽然某些文章提出ABAP CDS的性能由于Open SQL,但稍加辨别便可以知道其中的测试手法存在瑕疵。
实际上,它们在性能上几乎没有区别,这篇文章给出了相关讨论:A kill to an ABAP CDS View?
2022.1.19更新:如果CDS有Cache的话,上面的结论可能不再成立,参考:Dynamic Cache for CDS View performance optimization in S/4HANA
我(翻译的)的ABAP CDS教程合集:http://www.cnblogs.com/hhelibeb/tag/abap%20cds/