不规范的半结构化数据结构化梳理
本文最后更新于 2024-07-11,文章内容可能已经过时。
需求描述
线下30多张线下excel表导入数据库,需要支持对其中数据进行格式化/增删改查/综合搜索等。
适当破坏范式,冗余字段达到减少联表操作等优化查询和维护。
解决思路
三种方式:
方式一
使用json格式转化. 一个表存放分类/表头/字段解析的json内容
优点:
解析excel方便,直接一行一行读取,存进去,后续做增删改查和搜索,由于是一张表里,直接一条sql可以解决。
存在问题:
维护麻烦,容易出现问题,
excel表格式不规范,前端对接会很头疼。
(1 日期格式,在excel中自定义的日期,转换出来是距离1900年01月03日的天数,需要进行日期转换,并且还需要进行判断cell是否是日期。unioffice的文档和源码可阅读性差,example中也没有相关实例
(2 团队成员们,有多个字段表示,通过map映射,并且分隔符要注意。返回格式也要注意转换成json
数据量如果上去,进行搜索等解析json操作并不高效。
增改接口无法做数据校验,基于客户端信息不可信,如果存在错误数据,可能导致页面渲染异常
对应解决措施:
没办法,只有维护
日期问题-undo 团队成员转换成数组提供对应的教工号-可做
后续优化问题,当下还可以
通过对应category的field字段进行内容校验?工作量up^
方式二
excel转sql,存成多表,做一个总表维护各个离线表。
在gorm中,结构化后的表就不写结构体了,冗余且不一定有用
各个离线表需要一个id
优点:
多个单表,后续性能比解析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文件
参考文章: