首页 > 其他分享 >动态表单存储设计

动态表单存储设计

时间:2023-12-10 12:55:55浏览次数:42  
标签:comment 存储 null varchar 表单 field 250 动态

转载:https://www.yesdotnet.com/archive/post/1637668579.html

目录

前言

Flowable, Activiti 等开源解决方案所提供的表单引擎是没有业务表单数据持久化的功能(即自动创建表,将表单数据持久化功能),只提供动态表单创建以及渲染功能。目前来看表单引擎服务主要功能如下:

  • 动态表单配置以及渲染(主要在于前端实现)
  • 表单数据库持久化

以下是目前实现业务表单数据持久化的几种方案:

以下方案都以请假流程的表单为例,比较简单就请假天数(days)以及请假理由(reason),动态表单如下所示:

动态表单存储设计

方案一:动态添加字段

一个表单对应数据库的一张或多张物理表(主从表)

针对请假流程如何操作呢?给请假流程表单创建一张数据表,包含字段 days  以及 reason 。其他业务表单也是如此操作。

SQL全选
create table leave_data
(
	days int default 0 null comment '请假天数',
	reason varchar(250) null comment '请假理由'
)
comment '请假流程业务数据';
用技术成就未来 YES开发框架网 www.yesdotnet.com

该方案存在的问题:

  • 一个表单对应数据库的一张或多张物理表,随着业务的增多,数据库的物理表会不断膨胀。
  • 业务表单字段需要修改时(比如给请假流程添加一个开始时间字段,就需要调整物理表结构),其对应的物理表结构也需要修改,在物理表很多数据时,改变物理表scheme会锁表。

方案二:预留空白字段,动态分配

业务数据存储表:

SQL全选
create table data
(
  name varchar(250) null comment '业务表单名',
	field_0 varchar(250) null comment '字段0',
	field_1 varchar(250) null comment '字段1',
	field_2 varchar(250) null comment '字段2',
	field_3 varchar(250) null comment '字段3'
)
comment '业务数据';
用技术成就未来 YES开发框架网 www.yesdotnet.com

业务表单属性表:

SQL全选
create table table_config
(
	name varchar(250) null comment '表单名',
	field_name varchar(250) null comment '字段名',
  field_map varchar(250) null comment '字段映射'
)
comment '表配置';
用技术成就未来 YES开发框架网 www.yesdotnet.com

实际操作下来,存储是这样哒:

动态表单存储设计

动态表单存储设计

那么动态字段变更需要修改表字段配置表即可。

缺点:

  • 操作数据的时候都需要先去 map 中转以下才能查询(程序层面可以解决)
  • 如果一张业务表保存所有的数据话,不利于优化(可以进行扩展,配置多张业务表,不过这样也可能会出现方案一中物理表爆炸的问题)

方案三:属性使用 KEY/VALUE 格式存储

将表单数据全部都用 Key/Value 的格式来存储。参考如下:

SQL全选
create table attributes
(
  f_id varchar(250) null comment '关联id',
	key varchar(250) null comment '属性',
	value varchar(250) null comment '属性值',
	field_2 varchar(250) null comment '字段2',
	field_3 varchar(250) null comment '字段3'
)
comment '属性';
用技术成就未来 YES开发框架网 www.yesdotnet.com

具体操作后即是:

动态表单存储设计

动态添加属性字段只需要添加 Key/value。题外话,reddit 的数据库就两张表,也是这样的设计方案,不过现在已经改掉了,成为历史。

缺点:

  • 不太好支持关联子表
  • 程序中处理取值不方便

方案四:MongoDB 方案设计

MongoDB 方案的话,只需要将前端发过来的JSON写入即可,这里还是以请假流程为例:

动态表单存储设计

集合内数据允许动态添加字段:

动态表单存储设计

集合类似于关系型数据库中的表,可以存储不规则的数据,只能说 Mongodb 擅长干这种事情。

总结

以上方案设计生产环境使用还需要改进使用,目前市面上用的多得应该是方案二,MongoDB 也是一个不错选项,仅在数据持久化这块,具体业务场景下使用 MongoDB + 关系型数据库的设计也可以是一个备选的方案。

标签:comment,存储,null,varchar,表单,field,250,动态
From: https://www.cnblogs.com/cxxtreasure/p/17892409.html

相关文章

  • 动态规划专题4
    A.游戏王 时间:1s  空间:256M题目描述大哈是个游戏王,尽管他的水平一言难尽,但他却总是这样自我称呼。小羽说如果你能把这个游戏通关了,你才算是个真的游戏王。这个游戏一开始你有n个连在一起的颜色块,第i个颜色块的颜色为ai​。如果从i到j的颜色都一样,就说明i到j属于同一个连通......
  • 共享存储NFS
    什么是共享存储networkfilesystem网络文件系统NFS主要使用在局域网下,让不同的主机之间可以共享文件、或者目录数据主要用于linux系统上实现文件共享的一种协议,其客户端主要是Linux没有用户认证机制,且数据在网络上传送的时候是明文传送,一般只能在局域网中使用不需要输......
  • 3.8 使用动态调度、多发射和前瞻利用ILP
    3.8使用动态调度、多发射和前瞻利用ILP我们希望将动态调度、多发射和前瞻结合起来,以Tomasulo算法为基础,构建前瞻执行动态调度的多发射处理器。在动态调度的处理器中,无论是否前瞻,都需要更新控制表,否则会丢失相关性。要实现动态调度的处理器,关键就在于保留站的分配与流水线控制表......
  • 探索Linux存储管理:存储方式与基本分区
    在计算机领域,存储管理是操作系统中至关重要的一部分,而Linux作为一种强大的开源操作系统,其存储管理系统更是为用户提供了丰富的功能和灵活性。本文将深入探讨Linux存储管理的两个主要方面:存储方式和基本分区。存储方式1.文件系统:在Linux中,文件系统是组织和存储文件的一种结构。......
  • 在 wsl 中启动容器实例,相关资源默认存储在什么地方?
    在WSL(WindowsSubsystemforLinux)中启动的Docker容器实例,默认情况下相关资源存储在WSL的文件系统中。具体来说,WSL使用的是一个虚拟化的Linux环境,在Windows主机上运行,因此Docker容器实例的文件系统将存储在WSL的虚拟文件系统中。WSL提供了Windows和Linux文件系统之间的桥梁,使得在W......
  • 存储器原理以及介绍
    ROM、RAM是可读与可读可写存储器的一种框架,DRAM、SRAM、SDRAM是基于RAM框架的一种实现ROM:掉电不丢失,比如电脑的硬件磁盘RAM:掉电就会丢失,作为ROM与客户进行交互时提高反馈效率的一个中间介质,类似的还有CacheDRAM:全拼DynamicRandomAccessMemory(动态随机存储器)SRA......
  • 动态DMA映射指南 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/dma-api-howto.html动态DMA映射指南作者[email protected]@[email protected]本指南旨在向设备驱动程序编写者介绍如何使用DMAAPI,并提供伪代码示例。有关A......
  • 动态DMA映射使用通用设备 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/dma-api.html动态DMA映射使用通用设备作者[email protected]本文档描述了DMAAPI。要了解API的更详细介绍(以及实际示例),请参阅动态DMA映射指南。该API分为两部分。第一部分描述了......
  • Linux 磁盘存储管理
    BlueArchive磁盘存储管理概述Linux磁盘分区命名方式分区体系MBR分区和GPT分区管理分区的命令fdiskMBR分区gdiskGPT分区parted两者都可以下面主要以命令fdisk为例:fdisk-l//查看目前分区情况那我们就对/dev/sda进行分区吧:......
  • MySQL使用存储过程
     存储过程概念(简介):   存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化开发人员应用程序的很多工作,减少数据在数据库与应用服务器之间的传输,对提高效率是很有很好处的!存储过程的设计很简单,就是SQL语言层面的代码封装与重用! 特点: ......