物理模型
数据模型的物理模型,对应概念模型所映射的物理数据库表、视图、存储过程、SQL 语句、服务、JSON 等物理数据实体,是底层这块的数据存储模型。
物理模型与概念模型,是一种双向生成的关系。既可以正向从概念模型来生成物理模型,也可以反向从物理模型来生成概念模型。实际使用中,如果已有数据库中的物理模型,可以反向生成概念模型来减少开发过程。
数据表
数据库表是最常用的一种物理模型。在平台设计完概念模型的结构后,点击保存即可同步在物理数据库生成对应的表。保存时,会提示正在生成数据表。
在物理数据库中,已生成了对应概念模型的表:
物理表可配置的内容主要有以下几块:
数据集表名
这里以库存表为例,数据集标识为 stock,默认对应的数据表名为 mainstock,其中 main 是对应服务模块的标识,这里默认是 main 模块。如果在其他模块,比如 oa,那么生成的表名为 oa_stock。
这个生成的关系规则,是可以自定义配置的,在”表“页签中进行设置。如果手动配置了表名,比如就叫 stock,那么在数据库就会按照定义的表名来生成。
禁止建表
禁止建表开启后将不进行建表和发布数据,通常只在引入外部数据库表时开启。
意思是如果勾选了禁止建表,则由外部数据库这方来维护表的结构,不从数据模型这块进行同步。
扩展 SQL
系统在建表时,还可以执行一段 SQL,实现扩展能力。例如平台界面上没有提供创建多列联合索引的功能,那么可以在“扩展 SQL”中添加创建联合索引的 SQL。在建表后,系统自动执行这个 SQL,给表添加联合索引。
保存后,在物理表中可查询到该索引:
特别说明
- oracle 和达梦数据库不支持多行 SQL 执行,扩展 SQL 中增加 ===batch()=== 或 ===batch(error:continue)===,示例代码如下
- ===batch=== 表示执行下面的 SQL
- ===batch(error:continue)=== 表示执行下面的 SQL,如果报错则跳过,继续执行后面的 SQL
===batch(error:continue)===
DROP INDEX idx_orgs_code
===batch(error:continue)===
DROP INDEX idx_orgs_fcode
===batch()===
CREATE INDEX idx_orgs_code ON orgs (code)
===batch()===
CREATE INDEX idx_orgs_fcode ON orgs (fcode)
命名风格
常用的命名风格有小驼峰和蛇式命名。小驼峰的形式例如 salesOrder,蛇式的形式例如 sales_order。
平台默认使用小驼峰命名。
如果命名风格修改为蛇式,比如数据模型的列字段为 productType,则生成的物理数据库表的列字段为 product_type。
- 数据模型的列字段
- 物理数据库表的列字段
字段
必须
存储数据时,该列必须有值。列设置必须,建表时该列不允许 NULL。如下图所示订单编号列设置必须
数据表中 orderNo 列不允许 NULL
特别说明
- 如果该列之前允许为空,且数据表中有该列为空的记录,设置该列必填会报错,提示存在空值
- 数据集的列上提供一个高级设置:默认值(数据迁移),用来解决这个问题,在重新建表前,将空值替换为默认值(数据迁移)
唯一
该列中的值,在整个数据表中不允许重复。列设置唯一,建表时给该列创建唯一索引。如下图所示订单编号列设置唯一
数据表中 orderNo 列有唯一索引
索引
数据表中设置索引,通常用于提升查询速度。列设置索引,建表时给该列创建索引。如下图所示订单日期列设置索引
数据表中 orderDate 列有索引
字段名
数据集列标识和数据表字段名可以不同,在“列标识”中定义数据集列标识,在“数据库字段”中定义数据表字段名。当列标识和字段名不一致时,设置数据库字段名即可实现映射
长度和精度
数据类型设置为文本,建表时会创建长度为254个字符的可变字符串类型:varchar(254)。在高级设置中设置长度,建表时使用设置的长度创建可变字符串类型。如下图所示订单编号列设置长度为20
数据表中 orderNo 列的类型为最大长度20个字符的可变字符串类型 varchar(20)
数据类型设置为精确数字,建表时会创建长度为18,精度为2的精确数字类型:decimal(18,2)。在高级设置中设置长度和精度,建表时使用设置的长度和精度创建精确数字类型。
数据表中 money 列的类型为长度18精度2的精确数字类型 decimal(18,2)
默认值
系统提供两个默认值:默认值(建表)和默认值(数据迁移)
- 默认值(建表):用于设置列的默认值
- 默认值(数据迁移):用于某列从允许为空,变成不允许为空时,自动写入的值
特别说明
- 默认值使用 Spring Expression,不同数据类型写法不同
- 字符串:使用单引号括起来,例如:'xxxx'
- 数字:直接写数字,例如:123
- 当前日期时间:#currentDateTime()
- 当前日期:#currentDate()
- 指定日期时间:#dateTime('2018-11-11 00:00:00')
- 指定日期:#date('2018-11-11')
默认值(建表)
在高级设置中设置默认值(建表),建表时设置列的默认值。如下图所示支付方式列设置默认值为 RMB,注意字符串必须使用单引号括起来
数据表中 payType 列的默认值为 RMB
默认值(数据迁移)
当数据集的某列一开始允许为空,后续因业务需求,该列不允许为空后,此时数据表中存在该列为空的数据。在该列的高级设置中设置必须,此时开发环境、生产环境创建表时,都会报错(对非空字段进行安全性检查,出现数据迁移检查不通过),如下图所示
当数据表中存在空数据时,设置默认值(数据迁移),会在建表前将空值替换为默认值(数据迁移),设置界面如下图所示
重新建表后,空值都被替换为默认值(数据迁移),如下图所示
数据类型
建表时,系统根据数据库类型,将数据集列类型转换为数据库的数据类型,例如将文本转换为 varchar,如果需要使用指定的数据类型,在高级设置中设置数据类型,根据数据库类型,填入对应的数据类型,如下图所示,上架日期列转换为 timestamp
视图
同数据库表,数据模型的视图也会同步到数据库中生成对应的视图。
- 数据模型的视图
- 物理数据库的视图
存储过程
存储过程和表、视图存在不一样的地方,平台数据模型这边不保存存储过程的结构,只是引用存储过程名。
也就是物理数据库需要先有存储过程,数据模型这边再对存储过程进行引用。
- 物理数据库的存储过程
- 数据模型引用存储过程
由于存储过程支持入参的配置,因此数据模型这边也支持参数的配置:
对应存储过程的 IN 参数:
修改前备份
为避免数据丢失,平台对数据模型的修改,会在物理数据库同步进行表结构和数据的备份。
备份机制采用原表改名,在表名后加 _back_1 到 _back_5,5个备份表轮流使用。这样备份表保留了上一个版本的表结构和数据。实施效果如下:
在 sysmigrate 表中记录了最后一个备份表的名称和生成时间,在 key 中用表名查找,如下图所示
ER 图
在数据设计区,系统提供查看 ER 图(实体-关系图)的按钮,如下图所示,便于开发者了解数据库表结构及关联,支持导出为图片和 Word 文档。