本文最后更新于 2024-07-11,文章内容可能已经过时。

需求描述

线下30多张线下excel表导入数据库,需要支持对其中数据进行格式化/增删改查/综合搜索等。

  • 适当破坏范式,冗余字段达到减少联表操作等优化查询和维护。

解决思路

三种方式:

方式一

使用json格式转化. 一个表存放分类/表头/字段解析的json内容

field

category

content

["字段1",“字段2”,"字段3"]

分类1

{"字段1":"内容1","字段2":"内容2","字段3":"244"}

优点:

解析excel方便,直接一行一行读取,存进去,后续做增删改查和搜索,由于是一张表里,直接一条sql可以解决。

存在问题:

  • 维护麻烦,容易出现问题,

  • excel表格式不规范,前端对接会很头疼。

(1 日期格式,在excel中自定义的日期,转换出来是距离1900年01月03日的天数,需要进行日期转换,并且还需要进行判断cell是否是日期。unioffice的文档和源码可阅读性差,example中也没有相关实例

(2 团队成员们,有多个字段表示,通过map映射,并且分隔符要注意。返回格式也要注意转换成json

  • 数据量如果上去,进行搜索等解析json操作并不高效。

  • 增改接口无法做数据校验,基于客户端信息不可信,如果存在错误数据,可能导致页面渲染异常

对应解决措施:

  • 没办法,只有维护

  • 日期问题-undo 团队成员转换成数组提供对应的教工号-可做

  • 后续优化问题,当下还可以

  • 通过对应category的field字段进行内容校验?工作量up^

方式二

excel转sql,存成多表,做一个总表维护各个离线表。

在gorm中,结构化后的表就不写结构体了,冗余且不一定有用

各个离线表需要一个id

table_name

field

category

count

kcszsfkc

{"id":“序号”}

课程

11

优点:

多个单表,后续性能比解析json好,维护和更新也比json更方便。

存在问题:

  • 维护总表头

  • 综合检索似乎不好实现呢

实现增删改查/搜索:

fmt.sprintf()取table_name拼接sql

伪码:

//读取总表tableName,filed
//id取自各分表,
//比如:kcszsfkc需要增加数据
fmt.Sprintf("insert into %s(%s)",tableName,field)
count++
//删除
fmt.Sprintf("delete from %s where id = ?",tableName,id)
count--
//修改
fmt.Sprintf("update %s set ? where id = ?",tableName,id)
//查询列表
fmt.Sprintf("select * from %s where id = ?",tableName,id)

方式三

通过低代码表单实现

优点:

这种方式是第一种的深入后的形式。结合低代码表单已有的接口,可以实现数据的增删查改/搜索。

存在问题:

  • 需要开发导入功能:

(1将excel如何转换成低代码表单,

(2对应的数据/结构如何形成,

(3并且不能影响到现有表单,因为这部分不能算作表单的需求,在一些表单的统计等不能出现这部分表单内容

  • 后续还是要优化sql查询,低代码表单还是json解析,无法走索引,数据多了还是会有问题。

  • 综合检索还是无法实现,需要开发多表查询接口

  • 产品说这个线下表导入只是简单增删改查,不用表单做,太复杂

其他方式

以上方式都是基于现有条件,以及架构考虑。

如果考虑新增技术和架构则有更多方向。

比如通过一些可以处理非结构化数据的数据库进行excel数据的维护会更方便快捷,如mongodb支持直接处理excel文件

参考文章:

https://blog.csdn.net/harbor1981/article/details/51972094