[]
        
(Showing Draft Content)

实用技巧:数据库设计

推荐阅读

技术决策者

项目经理

高级技术人员

初级技术人员

测试人员




type=info

数据库设计的专业性较强,良好的数据库设计可以显著提升系统的可维护性,推荐安排团队内经验较丰富的开发者负责数据库设计,对新人做的设计进行检查。

一、创建数据库:内置库 vs 外联库

活字格同时支持基于主流的数据库开发(外联库,如Microsoft SQL Server、MySQL等),也可以基于内置的SQLite文件数据开发。外联库在性能、可维护性、可扩展性等角度优于内置库。数据量少、并发数量低、无需专业备份和维护管理的简单应用可以采用内建库;其他场景均建议采用外联库。


在安全性和可维护性方面,推荐时间如下:

  • 做好安全防护,严格控制生产环境的数据库访问权限

    • 通用:将数据库服务器和活字格应用服务器放到一个内网中,仅允许应用服务器的IP地址访问数据库

    • Microsoft SQL Server:如果能熟练配置Windows身份认证(SSPI),优先使用Windows身份认证,而不是用户名+密码的方式访问数据库

    • MySQL:为活字格应用服务器创建专门的用户,不要使用root用户访问数据库

    • 更多安全实践,详见:安全防护自查清单

  • 为活字格应用创建专用的数据库,如需访问其他系统的数据,请参考 系统集成的推荐模式

二、设计数据表

数据库设计的专业性较强,且与开发技术无关。使用活字格开发的系统,在数据库设计上与其他编码开发方式并没有差别。

2.1 遵循设计范式

  • 使用设计器的【表关联】功能,确保数据库设计遵循数据库设计范式,特别是1NF-3NF,参考:【背景知识】数据库设计示例

    • 1NF:无重复的列。数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。如果不能满足范式,必须拆分为不同的属性

    • 2NF:属性完全依赖于主键。数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关。如果不能满足范式,必须拆分为从表

    • 3NF:属性不依赖于其它非主键属性。数据表中的每一列数据都和主键直接相关,而不能间接相关。如果不能满足范式,必须拆分为字典表

  • 使用设计器的【公式字段】功能,在满足1NF的基础上,简化数据查询操作。参考 帮助文档

  • 使用设计器的【统计字段】功能,在满足2NF的基础上,简化数据查询操作。参考 帮助文档

2.2 选择合适的字段类型

下表为活字格设计器的字段类型与外联库字段类型的对应关系及部分典型应用场景:

活字格字段类型

外联库的字段类型(例:Mysql)

文本

VARCHAR、TEXT,根据长度自动判断

整数

INT

小数

FLOAT

是/否

BOOL/TINYINT(1)

时间

DATETIME

日期

DATE

附件

VARCHAR (活字格存储的是文件唯一标识,而不是文件本身)

图片

VARCHAR (活字格存储的是文件唯一标识,而不是文件本身)

用户

VARCHAR (活字格存储的是用户名)

参考:【背景知识】数据库设计示例

2.3 缺省值、主键与索引

  • 尽量为字段设置【缺省值】

  • 为业务上有编码规则的字段启用【自动编号】,简化数据添加操作。参考 帮助文档

  • 使用外联库时,为每一个表和视图创建主键

  • 不要将用户可输入修改的数据作为主键,如员工档案表的身份证号等

  • 使用外联库时,需要在关联字段上创建索引,以提升性能。更多性能优化技巧,详见:数据库性能优化

  • 使用外联库时,分析使用频率高的查询功能,作为查询条件的列需要创建索引,以提升性能

2.4 外键与约束

  • 为业务上有唯一性要求的字段或字段组合勾选【唯一】

  • 为业务上有必填要求的字段勾选【必须】

  • 使用外联库时,为位于同一个数据库上的关联字段创建外键约束

2.5 管理数据库的版本

数据库的版本管理和活字格工程一样重要。而数据库的版本管理需要重点关注数据库差分脚本,即将一个版本的数据库结构升级到另一个版本结构所需执行的SQL脚本,在系统上线或升级时,需要使用差分脚本,将原来的数据库升级到与新的应用匹配的版本。差分脚本中通常需要包含的内容如下:

  1. 表操作

  2. 列操作

  3. 主键操作

  4. 约束操作

  5. 内置数据

您可以手工维护每个版本的数据库差分脚本,如从零开始创建V1版本,从V1版本升级到V2版本等等。您也可以使用第三方数据库对比工具,如MySQL官方提供的Mysqldbcompare等,自动生成数据库结构差分脚本,配合手工编写的内置数据差分脚本来使用。相比之下,手工维护数据库差分脚本,并且将其及时更新到测试环境的优势如下:

  • 内部审查(Pear review)便利:可以针对每个数据库结构上的修改,及时组织审查,相比于版本开发完成时统一做,审查的效率更高。

  • 质量风险小:每天的CI/CD中,在测试数据库上执行差分脚本,意味着每天的脚本都是经过测试的。参考:配置管理:测试环境、验证环境与生产环境

参考教程:如何创建、修改并发布外联库的表结构和内置数据

三、数据库编程

数据库编程可以有效提升批量数据处理的性能,但风险较高,推荐由团队内技术能力较强的同事负责SQL语句的编写和审查

  • 用SQL编写视图、存储过程,或通过【执行SQL命令】运行SQL语句来代替数据表操作命令,可以进一步提升复杂查询和数据处理的性能

  • SQL编程需满足对应数据库厂商提供的最佳实践(内置库为SQLite)

  • 对于初级技术人员编写的SQL语句,建议由高级技术人员做技术把关,避免对数据的误操作带来不可预期的损失

  • 为了避免系统可维护性变差,不建议使用触发器

四、数据安全

详见:安全防护自查清单(数据库相关章节)

五、性能优化

详见: 性能优化自查清单(数据库相关章节)

六、其他技巧

  • 如果需读取用户信息(如全名、邮件、自定义属性等),可在设计器中创建和使用用户信息视图。

  • 在项目文档中添加并及时维护数据库ER图。

  • 进入开发阶段后,数据库设计的变更应有专人负责审核。

  • 上线前,确保应用(内置库)和外联数据库均启用自动备份。

type=info

image 温馨提示

企业级低代码开发最佳实践是活字格官方面向进阶开发者推出的产品技术资源,旨在帮助对活字格基本功能有一定了解的开发者快速提升应用开发能力,保质保量做好企业级项目交付。如果您是初次接触活字格,这些内容可能会有些艰深难懂,这也是正常的。如果您有软件开发经验,推荐您学习《面向程序员的活字格入门课程》;否则,您也可以免费报名参加新手训练营直播课程或购买阅读《低代码开发实战:基于低代码平台构建企业级应用》(机械工业出版社),快速上手低代码开发。