SAP CAP篇三:定义Model

news2024/10/7 10:22:59

SAP CAP篇一:快速创建一个Service,基于Java的实现
SAP CAP篇二:为Service加上数据库支持

文章目录

  • 理解CAP的Model
    • Domain-Driven Design
    • KISS
    • Basic Types
    • Common Reuse Type
      • `cuid`
      • `managed`
      • `temporal`
      • Country, Currency, Language
      • `codeList`
  • Assocation & Composition
    • 0..1的关联关系
    • 0..N的关联关系
    • M..N的关联关系
    • Composition

理解CAP的Model

继续额外的开发之前,需要了解下SAP CAP的Model的理念。

SAP CAP的Model,是通过SAP CDS来实现的。关于SAP CDS的具体内容,参阅官方文档。本文只是试图提炼其中比较基础及比较关键的几个部分。

总的说来,SAP CAP中Model的核心理念为包括以下几部分。

Domain-Driven Design

所谓的Domain-Driven Design 的缩写为DDD。通常认为DDD的概念起源于2004年Eric Evans的书籍《领域驱动设计》。其中,第一个D表示Domain,直译为领域,表达的其实是业务为先的理念。譬如,财务领域的凭证,需要保证所有行项目的金额总和为0,即“有借必有贷,借贷必相等”的领域需求。所以在建模(model)的时候,需要考虑反映Domain的业务概念。

Model

至于别的DDD的概念,譬如:Service, Module,等,参阅DDD相关的书籍或文档。

Model 2

KISS

KISS是“Keep it simple, stupid!”的缩写,是另外一个SAP CAP遵循的Design原则。针对此原则,SAP CAP强调了下述关键项:

clean = don’t pollute them with technical details。建模时尽量避免加入太多技术细节。
concise = be on point, use short names, simple flat models, etc. 模型应该简洁明了,避免长名称。
comprehensible = domain modeling is a means to an end; your clients and consumers are the ones who have to understand and work with your models the most, much more than you as their creator. Keep that in mind and understand the tasks of domain modeling as a service to others. 模型关键是便于使用者理解。

Basic Types

SAP CDS的基础类型:

Built-in Type

Common Reuse Type

SAP CDS提供了许多可重用的对象,包括Type, Aspect等等。详情请参阅官方文档。

这里,仅罗列下常用的有:

  • cuid
  • managed
  • temporal
  • Country, Currency, Language
  • codeList

cuid

cuid用来定义用UUID作为key的Entity,并且该key的名称为ID

entity TestObject: cuid {
    ...
}

等同于,

entity TestObject {
    key ID : UUID;
}

managed

managedcuid类似,也是提供了一些非常常用的定义:创建者信息,创建时间戳,最后修改者信息,最后修改时间戳。

entity TestObject: managed {
    ...
}

等同于:

entity TestObject {
  createdAt  : Timestamp @cds.on.insert : $now;
  createdBy  : User      @cds.on.insert : $user;
  modifiedAt : Timestamp @cds.on.insert : $now  @cds.on.update : $now;
  modifiedBy : User      @cds.on.insert : $user @cds.on.update : $user;
}

temporal

temporal其实就是为Entity添加Valid FromValid To两个字段。

参见temporal的实现:

aspect temporal {
  validFrom : Timestamp @cds.valid.from;
  validTo   : Timestamp @cds.valid.to;
}

Country, Currency, Language

作为这个星球上最成功ERP软件厂商,SAP不可能不考虑到一些常用的属性:Country, Currency, 和Language信息。

定义引用:

using { Country, Currency, Language } from '@sap/cds/common';

codeList

codeList是一个常用的表示的name/description名称值的aspect

aspect sap.common.CodeList {
  name  : localized String(111);
  descr : localized String(1111);
}

其中,localized可以用来定义支持多语言的项。这种支持是从SAP CDS语言深层次来支持的,包括从HTTP Request读出对应locale信息,以及使用该信息从数据库中读取合适的记录。关于Localized可以参考官方文档,点击链接。

using { Currency } from '@sap/cds/common';

entity TestObject: cuid, CodeList {
  key ID       : UUID;
      amount   : Decimal;
      currency : Currency;
}

如果通过cds deploy到数据库来看,会生成两张数据库表:

Table1

同时会生成一张Text的表来支持多语言(locale就是对应Localization的Key):

Text table

Assocation & Composition

所谓的AssocaitonComposition,就是Entity之间的关联关系。

0…1的关联关系

譬如,EntityAEntityB的0…1的关联关系,定义如下。

entity EntityA {
  rel : Association to EntityB;
}

entity EntityB: cuid {
  ...
}

数据库中,列rel并不存在,而是类似于rel_ID——这里取决于EntityBkey名称。

0…N的关联关系

同上例,

entity EntityA: cuid {  
  rel : Association to many EntityB
    on rel.relation = $self;
}

entity EntityB: cuid {
  relation : Association to EntityA;  //> the backlink
}

同上,数据库中的foreign key的列,名称由关联Entity的key决定。

M…N的关联关系

继续,创建M…N的关联关系:

entity EntityA: cuid {  
  rel : Association to many EntityABBridge
    on rel.relA = $self;
}

entity EntityABBridge {
  key relA : Association to EntityA;
  key relB : Association to EntityB;
}

Composition

其实Composition就是一种类型的0..N的关联关系,但它是双向的。

entity EntityA: cuid {
  Items : Composition of many EntityA.Items on Items.parent = $self;
}

entity EntityA.Items: cuid {
  key parent : Association to EntityA;
  ...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/507611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

匹配算法之 匈牙利算法详解

参考: 算法学习笔记(5):匈牙利算法漫谈匈牙利算法匈牙利算法、KM算法匈牙利算法(二分图)通俗易懂小白入门)二分图最大匹配——匈牙利算法多目标跟踪之数据关联(匈牙利匹配算法和KM算法)【小白学…

手把手教你使用gtest写单元测试

开源框架:gtest,它主要用于写单元测试,检查真自己的程序是否符合预期行为。这不是QA(测试工程师)才学的,也是每个优秀后端开发codoer的必备技能。 本期博文内容及使用的demo,参考: …

40、Java 并发编程基础 ①

目录 一、进程(Process)二、线程(Thread)三、线程的串行四、多线程五、多线程原理六、多线程优缺点七、Java 的默认线程八、开启新线程(1) new Thread()(2) 继承 Thread,重写 run 方法(3) run() 和 start() 九、多线程…

AutoCV第八课:3D基础

目录 3D基础前言1. nuScenes数据集2. nuScenes数据格式3. 点云可视化总结 3D基础 前言 手写 AI 推出的全新保姆级从零手写自动驾驶 CV 课程,链接。记录下个人学习笔记,仅供自己参考。 本次课程主要学习点云数据的可视化。 课程大纲可看下面的思维导图。…

【Shiro】SimpleAuthenticationInfo如何验证password

一、前言 通篇的关键就是知道ShiroRealm类重写的doGetAuthenticationInfo这个方法,到底是谁的方法。 从上图我们可以知道,ShiroRealm最终继承到了AuthenticatingRealm这个方法。 二、自定义的ShiroRealm类 ps:该图中①上的注释是没看过底…

Jetpack之livedata原理

1.LiveData是什么? 只有在生命周期处于started和resumed时。livedata才会更新观察者 2.Livedata的各种使用方式 1.更新数据 class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceSta…

c++之函数对象和谓词

目录 函数对象: 谓词: 一元谓词函数举例如下 二元谓词举例如下 函数对象和函数的区别 一元谓词的案例 二元函数对象案例 二元谓词案例 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function obj…

内网渗透之linux到linux横向移动-ssh

0x01 一般情况下SSH密钥存放在~/.ssh/目录下,也可以文件中搜索已保存的SSH凭证 ~/.ssh/config ~/.ssh/known_hosts ~/.bash_history grep -ir "BEGIN RSA PRIVATE KEY" /* grep -ir "BEGIN DSA PRIVATE KEY" /* grep -ir "BEGIN OPENSSH…

SpringBoot入门学习笔记-快速认识

SpringBoot入门学习笔记-快速认识 快速案例入门案例解析parentstarter引导类内嵌tomcat ) 快速案例 在controller定义一个类 package com.ustc.sp5.controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.…

redis 数据类型简介

redis 数据类型 redis的五种数据类型是:1、string(字符串);2、hash(哈希);3、list(列表);4、set(集合);5、sort set &…

QT初体验:手把手带你写一个自己的串口助手

前言 本文记录一下用QT Creator 写一个基本功能齐全的串口助手的过程,整个工程只有几百行代码,跟着做下来对新手来说可以更快了解整个QT项目的开发过程和一些常用控件的使用方法。对新手学习QT能增强信心,话不多说,正文开始 先看…

Mysql日志redo log、bin log、undo log 区别与作用及二阶段提交

一、redo log 重做日志 作用:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。 内容:物理格式的日志&#x…

46-Dockerfile-USER/WORKDIR指令

USER/WORKDIR指令 前言USER作用格式使用示例 WORKDIR作用格式说明使用示例 前言 本篇来学习下Dockerfile中的USER/WORKDIR指令 USER 作用 指定运行容器时的用户名或 UID,后续的RUN等指令也会使用指定的用户身份 说明: USER 只是帮助我们切换到指定的…

12_Uboot启动流程_4

目录 images全局变量 do_bootz函数 bootz_start函数 do_bootm_states函数 bootm_os_get_boot_func函数 do_bootm_linux函数 images全局变量 不管是bootz还是bootm命令,在启动Linux内核的时候都会用到一个重要的全局变量:images, images在文件cmd/bootm.c中有如下定义: i…

【2023/05/09】Scratch

Hello!大家好,我是霜淮子,2023倒计时第4天。 Share The mighty desert is burning for the love of a blade of grass who shaks her head and laughs and flies away. 译文: 无垠的沙漠热烈追求一叶绿草的爱,她摇摇…

PCL中点云分割算法简析

文章目录 前言一、点云分割算法简介1.1 基于RANSAC的点云分割1.2 基于聚类的点云分割1.2.1 欧式聚类分割 1.3 基于深度学习的点云分割 二、算法示例2.1 基于RANSAC的平面分割2.2 欧式聚类2.3 基于PointNet的点云分割 总结 前言 点云分割算法广泛应用于激光遥感、无人驾驶、工业…

centos安装nginx教程

安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可以安装 Windows 版本,本篇则使用 CentOS 7 作为安装环境。 一. gcc 安装 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境&#xff0c…

【ESD专题】案例:TVS管钳位电压能不能通过TLP测试数据表征?

这几天遇到一个问题,就是还是想说TVS管导入的时候需要进行IEC61000-4-2 8kV接触静电的钳位波形测试。 比如有时可以看到规格书中给出对应的在IEC61000-4-2 8kV接触时的真实钳位波形: 根据我们文章【ESD专题】TVS管的选择的误区及钳位电压测试方法和一些参考手册所说…

计算机操作系统第四版第七章文件管理—课后习题答案

1.何谓数据项、记录和文件? 数据项:是最低级的数据组织形式,可以分为两种类型:基本数据项和组合数据项。基本数据项是用于描述一个对象的某种属性的字符集,是数据组织中可以命名的最小逻辑数据单位,又称为字…

使用volta对node版本进行控制

安装volta 首先下载volta 下载完成之后在电脑上使用命令行工具查看是否安装成功 volta -v 使用 volta -h 命令可以查看volta的一些用法 安装全局的node版本,可以有三种,第一种是安装最新的,第二种是安装某一个大版本下的,第三种是安装指定的node版本(安装的时候需要等待一段时…