元数据-定义约定(实战使用设计)

元数据-定义约定(实战使用设计)

元数据Metadata),又称中介数据中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。元数据算是一种电子式目录,为了达到编制目录的目的,必须描述并收藏数据的内容或特色,进而达成协助数据检索的目的。

摘自百度百科,最近整理一波有关元数据使用定义的实战;一些零散的知识点整理,记录有关灵感.

约定大于配置,配置大于编码,有些眼前一亮的编码会记录,同时也记录一些感悟;

场景一

再有些场景下需要用到存储过程,然而现有的编辑器不支持直接再存储过程内搜索存储相关片段代码,比如我需要找有关某一个表的存储过程,哪些存储过程操作这个表;

一般情况下我习惯再存储过程中加个类型,或者说就是以表明命名存储过程(但是设计到多表就会以业务做名称,不过多人开发的情况下会存在着各种各样的定义,你可能找到你自己的代码,但是别人的代码你只能单个打开去 ctrl f). 当然类似的场景之前有遇见过,就是全局搜索表名称,后来在 navicat 找到了现成的功能.

请参考 Navicate 使用与 SQL 分析 这个是当时想找指定表的创建表 sql 的,导出 sql 复制.

实现代码

忽略中间 mapper 层接口,内容就是查找 mysql 的记录存储过程的元数据,然后循环去获取存储过程源信息,通过 string 获取 Create Procedure 参数去获取存储过程详情, Sting 的 contains 包去比对是否包含指定字段,将包含该信息的存储过程记录到返回参数中.

其他坑, mysql 的设计者在 8 版本的数据库中 取消 mysql.proc (5.7 可用) 源信息存储位置变更还是蛮坑的,不过在像这个需求的时候觉得总要有记录这个信息的位置,虽然对源信息存储的东西不太了解,但是大概我们能想到的,实际上可记录的重要信息都可以在 mysql 的源信息中找到,使用的时候自行百度就好了.

@GetMapping("/contain") public ArrayList<String> once(String name) { System.out.println("==================== 开始 "); ArrayList<String> strings = new ArrayList<>(); List<String> allProcedureList = handlingDatabaseSql.getAllProcedureList("yidiansishiyi"); for (String s : allProcedureList) { Map<Object, Object> onceProcedure = handlingDatabaseSql.getOnceProcedure(s); String string = onceProcedure.get("Create Procedure").toString(); if (string.contains(name)) strings.add(s); System.out.println(onceProcedure); } System.out.println("结果 =========="); strings.forEach(System.out::println); return strings; }
<select id="getOnceProcedure" resultType="java.util.Map"> SHOW CREATE PROCEDURE ${procedureName}; </select> <select id="getAllProcedureList" resultType="java.lang.String"> SELECT `name` FROM mysql.proc WHERE db = '${dbName}' AND `type` = 'PROCEDURE'; </select>

场景二

分表存储 excel .

将 excel 表格存储为一张表,表明是中文字段,这个实现有个前提表格内特殊符号需转义存储

解决方案

  1. 直接建立中文名称表头
  2. 情况一可能出现错误,建立无实意表头,如 a01 , a02 将中文表头抽离存储在其余位置导出展示等单独提取建立对应关系;

    详情见 数据库优化系列之分表实践与思考

场景三

导出权限表比较少,或特殊情况下聚合查询在一张表头无实意表内,以某一字段类型为标识区分数据使用场景,但在外层其他数据表内仍需还原,(该场景比较单一,但是统计指标时候,或者针对无导出权限或缺少权限时使用);

这种情况下,如不记录导出信息,多次数据表转换后,因为使用无实意表,会导致后期开发压力剧增,可统一增加源信息记录表,对每种类型的建表语句统一保存,更改时更新,记录原始建表语句和更新语句,类似于 Java 的 Object 类,泛型擦除,后仍有位置记录原始类型,在需要时强转回去;

实际意义

​ 在大多数时候,复杂的编码不如简单的配置,简单的配置不如强制遵守的约定,好的约定能减少编码的难度,增加程序的可扩展性,好的代码能为以后的需求预留可供扩展的余地,程序员在自身擅长的领域很快的进化为搬砖的,在几周前,写个导出代码很难,但是整理了一个常见简单列表导出工具类之后,我就是个搬砖的,整理了一个统一权健注解后,只要遵守哪个约定的,我直接给到注解就好了,一个好的工具类能考虑到各种可能,源信息的定义和使用无非是约定一种写法存储重要固定格式的信息,电子目录索引,合理的使用他人指定的源信息规则,制定属于自己的合理通用的约定,制定自身更实用的源信息,以更合适的存储媒介存储能大大增加开发效率;

源信息存储和保密

源信息的存储形式多种多样,实际上只要快速方便解析的存储方式怎么去存储,选择任何一种合理的存储格式都可以,常见的有以下几种.

  1. JSON(JavaScript Object Notation):JSON 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于解析和生成。它是一种常见的存储格式,被广泛应用于Web开发和API接口的数据传输。
  2. XML(Extensible Markup Language):XML 是一种可扩展的标记语言,它具有良好的结构和层次性,能够描述复杂的数据结构,并且具有广泛的应用领域,例如配置文件、文档存储等。
  3. YAML(YAML Ain't Markup Language):YAML 是一种人类可读的数据序列化格式,语法简洁清晰,易于阅读和编辑。它在配置文件、数据序列化等场景中得到了广泛应用。
  4. CSV(Comma-Separated Values):CSV 是一种简单的表格数据存储格式,数据以逗号分隔,每行代表一条记录。CSV 格式通常用于导出和导入数据,易于处理和转换。
  5. Protocol Buffers(protobuf):Protocol Buffers 是一种高效的序列化数据格式,它具有紧凑的数据编码格式,支持多种编程语言,适用于高性能的数据传输和存储。
  6. Avro:Avro 是一种基于二进制格式的数据序列化系统,它提供了动态数据结构和数据压缩功能,适用于大规模数据的存储和传输。
  7. 数据库存储 : 持久化好,支持 ACID ,参考mysql 源信息
  8. Properties文件存储 : 参考配置文件配置

安全

有些源信息是不能对外随便透露的,比如mysql 的具体有那些存储过程,和具体存储过程,在写功能测试的时候发现先如果用权限不够的账号不能查看这些信息,比如 一个项目的配置也不应该轻易对外公布,容易被人顺着网线溜进来,

索引对应信息的权鉴,是否加密存储都需要提前想到

如, 提交时忽略提交配置文件

使用第三方库加密配置文件 jasypt https://www.cnblogs.com/zhi-leaf/p/16628354.html

开箱即用,不过实际测试发现加密后的参数,项目代码获取是明文可以直接输出,嗯,没去了解过具体加密逻辑,不过,应该不存在加密过的配置文件拿去别的项目里写一个读取逻辑就能直接获得明文的可能性.(有些智障是吧)

维护

增删改查,及时性,就像代码的备注,错误的跟不上版本的备注比不留备注更可怕,记录源信息也一样,要建立可靠性高的维护方案,确保信息及时正确.

同时在建立之初就要考虑到扩展的可能性,尽量做到对扩展开放,对修改关闭(最近改的代码有点多),可扩展性搞的程序和结构对后期开发维护都十分友好.

打个比方,可扩展性搞得程序就像是乐高的积木,能轻松拼接变成新的东西,而扩展性低的程序即使同样能实现功能,但在需求变动的时候动起来就像是解压缩包,有可能压缩算法还是自己写的冗余那种,先看懂算法,完美解压之后在进行扩展操作.我愿称之为有损压缩式编程.当然需求的变动是不可预测的,只能坚守一些基本原则,多多学习积累经验应对这种情况.走在需求前.

写在最后

​ 约定的意义大于编码,有时候简单了解别人的好的约定能减少非常多的开发时间成本呢,比如昨天修改地图的时候有关经纬度位置信息的一些约定,看懂后直接将问题解决时间缩短,但是不清楚约定的时候只能一点点用经验去猜想可能性,列举证明一点点走回正确的道路上,有的时候我们只需要意识到有这个约定.

​ 有些约定知道和不知道差距超大,没办法提前意识,只能凭借良好的习惯,经验去快素学习上手,积累经验,多看,多找,有的时候最慢的路反而是最快的,找到合适的约定,提高编码开发的效率.

本期填坑

元数据部分信息,看了Java 的一些基础设定,学习了下;

很久以前就像开发下从存储过程里快速搜索关键字的功能,我不太信任眼睛;

整理之前学习的内容;

Java 基础, sql 元数据结构设计,地图有关经纬度知识(大概看过一些博客,知道为什么怎么用)

#学习总结# #Java#
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP