元数据思想-打破传统的思维方式

news2025/1/20 5:52:13

本文已收录公众号(面汤放盐):元数据思想-打破传统的思维方式

本文是一篇讲解元数据案例的技术文章; 同时也谈论如何对传统 CRUD 进行破局的文章。

元数据思想-打破传统的思维方式

打破传统的思维模式, 跳出固有的认知模型,从更高的视角去理解这个世界。

我将从案例进行逐步分析、讲解,一步步地打破固有模式; 感受一下从元数据的思维方式去解决传统的 CRUD。

一、构建查询案例--“看山是山,看水是水”

1.1 案例背景

下面是一个案例,该工具是帮助运维人员对公司的不同账号类型进行管理的后台。

比如下面是 T1 类型的账号, 通过输入 T1 类型账号,可以显示账号的数值列和操作列。 比如“打标” 是可以点击操作的操作列,员工ID只做展示的就叫数值列。

当然我也很难用一两句话让大家明白业务; 于是我简化业务,用更加技术的语言和图片来描述上面的功能场景。

T1 类型账号, 有3个数值列,2个操作列。

T2 类型账号:3个数值列,3个操作列

当然还有 T3、T4......不再赘述。

总结的规律:数据列和操作列是根据账号类型返回的, 列和值的数量是不同的。

一句话需求: 不同账号类型有不同的数值列和操作列。

那么,针对这样的需求,应该返回什么样的数据格式呢?接下来按照传统方式写一些 CRUD了。

1.2 传统思维模式-照着原型建模

于是会按照给定的原型进行数据建模,针对不同的账号类型返回不同的 VO 对象。

比如 T1 类型的账号 VO 返回体和数据实例如下:

[{
  "userId":"T1-001",
  "userName":"运维人员A",
  "isEnterprise":"是",
  "doFlag":"打标",
  "resetStatus":"重置状态" 
}]

并且和前端约定:doFlag 和 resetStatus 有值的时候,作为行为列。(告诉前端这个两个值要写死!)

同理 T2 类型的账号 VO 返回体,方式一样, T3、T4....... 如下所示:

传统开发模式: 拿着原型进行建模,就像上图一样,一一对应,好像没有什么难度。

打入这一行起,好像都是这么搞的,毫无问题。

这是一种传统的思维,甚至是一种僵化的思想。

1.3 劣势

这种按照原型建模开发的方式虽然非常简单,但是也存在一些弊端。

结合案例说劣势可能会更有体感。

 比如 T1类型和 T2类型,虽然很相似,但是一样需要有两套数据模型,甚至前端也需要写两套逻辑;类型越多,模型越多;

另外哪些列需要写成行为列,也需要固定写死; 

甚至当业务需求发生变化后,比如增加一个字段或者删除一个字段,从后端到前端,都要进行一一修改。

二、打破思维僵局--“看山不是山,看水不是水”

2.1 思维破局

既然传统方式有这么多不足,那么是否可以寻求一些变化,以此来破局呢?

再来回顾下面这张图(看这个世界的视角不同,解决方法也是不同的)

视角是会影响到思维的,因此可以从更高的视角来解决问题。 

进行传统功能开发的,就是按照一种较低的视角进行思维活动的。

如下所示:照着原型建模,谁不会呢? 上半部分是原型,下半部分是模型; 就像那只在井里的蛙一样,看这个世界的方式总是抬头向上。

尝试站在更高的视角去看问题,尝试跳出固有的认知习惯,尝试以不一样的方式去理解这个需求。

于是提出一个想法:对表头行,数据行进行统一的建模。

  1. 对表头进行分析,建模;对列值再进行分析建模。

  2. 达成统一抽象

表头建模:

key:表示表头的唯一id值

title:表头需要展示值

type:表头对应的类型,type=action 表示这个列是行为列。

当然还可以对表头增加宽度、数值类型的元素,但考虑简单就忽略了。

列值建模:

key:与表头保持一致

value:表示具体值

对整个查询列表进行模型的重构,这样的模型具有更高的抽象维度,更具有普适性,扩展性。

所有的查询列表都按照上面的模式进行重构; 不管是 T1、T2、T3还是其他,都能使用同一模型进行表示。

对数据本身进行一种描述;从更高的视角进行抽象。

2.2 新的思维建模

那么返回的数据不再是固定模式的值了。对表头进行建模。三个字段如下:

对于数值列,这里比较简单,就用 key 和 value 就好了。类似 Map<Key,Value>

表头和数值列就如下所示:

数据案例如下:

{
	"headerList": [{
			"key": "userId",
			"title": "员工Id",
			"type": "display"
		},
		{
			"key": "userName",
			"title": "员工名称",
			"type": "display"
		},
		{
			"key": "isEnterpise",
			"title": "是否已是企业账号",
			"type": "display"
		},
		{
			"key": "doFlag",
			"title": "打标",
			"type": "action"
		},
		{
			"key": "resetStatus",
			"title": "重置迁移状态",
			"type": "action"
		}
	],
	"valueList": [{
		"isEnterpise": "是",
		"isWhiteList": "是",
		"userName": "运维人员A",
		"userId": "T1-001",
		"doFlag": "打标"
	}]
}

针对数据列,采用统一的接口。前端不用关心业务。

{{url}}/opsOperation?operationKey={{key}}&userId={{userId}}

通过 operationKey 作为后端路由值。比如打标的时候,operationKey = doFlag

通过这样的方式:所有的账号类型都可以采用统一数据模型。具有统一性、普适性、扩展性。

2.3 优势

  1. 前端不用再关心业务,仅关注技术开发,不用涉及业务

  2. 更能应对变化:比如可以将表头等信息放在分布式配置中心,这样可以动态新增调整,如后端可以动态控制列的个数、行为个数;当业务发生变化的时候,只后端进行调整,变更成本更低

  3. 技术质量:代码重复度低,扩展性也更强

  4. 当然也更有趣

虽然实现效果可能都是一样的,但实现的方式却千差万别;后续的维护成本也完全不同。

这是视角的不同,思维方式的不同, 同时也是一种抽象能力的不同。

三、一招鲜,吃遍天 --“看山还是山,看水还是水”

3.1 元数据思维

可以再来回顾一下这种图,可能现在会更有体感了。

元数据思维,从更高的视角去看问题;习惯跳出数据本身,而不是被数据本身所束缚。

只有跳出数据的泥潭,才能看清泥潭。“不识庐山真面目,只缘身在此山中。”

元数据是对数据本身的描述,层次更高!也是抽象维度、抽象粒度的不同。

可能你想问有什么秘诀吗?我可能会回答你,依葫芦画瓢地实践!这样你才会慢慢有体感!

关于抽象的文章,感兴趣可以阅读这两篇文章。

写代码这件事,迈入第七个年头才有了一些心得(第二章 抽象) - 掘金写代码这件事,迈入第七个年头才有了一些心得(第三章 抽象下篇) - 掘金

简单总结:

元数据:对数据进行描述。元数据的思想,尝试用更高抽象度定义数据;并跳出传统思维,用不一样的视角进行思维活动。 通过实践练习可以达到更好的效果。

3.2 更多案例

这种更高粒度的抽象案例其实还挺多的。也挺有意思的,对于 CRUD 传统思维的破局是一个非常不错的方式,简单再总结几个曾经做过的小案例。

案例一:表单类型的搜索

比如:搜索大于,小于,等于。

针对搜索控件进行建模,比如可以抽象建模:

  1. 搜索方式

  2. 搜索值

  3. 数据类型

案例二:动态展示列

可以动态展示列。比如本案例中过,就可以根据前端勾选列,动态从后端去搜索多少列动态返回。

案例三:低代码

低代码台则更是抽象层次更高也更复杂,但是这种思维是能进行移植的。

其他的就不再一一赘述了。

3.3 最后感慨

编程的核心不是技巧,而是思维 !

与其天天写一些没啥技术含量的东西,不如尝试变通一下!

与其坐而论道 不如起而行之!

最后再来回味一下这个图,希望有更多的想法和灵感!

欢迎关注微信公众号:面汤放盐(一个专注技术干货的博主)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1469807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

社区分享|中华保险基于MeterSphere开展接口自动化测试

中华联合保险集团股份有限公司&#xff08;以下简称为“中华保险”&#xff09;始创于1986年&#xff0c;是全国唯一一家以“中华”冠名的国有控股保险公司。截至2022年12月底&#xff0c;中华保险总资产为1006.06亿元&#xff0c;在全国拥有超过2900个营业网点&#xff0c;员工…

Python入门必学:reverse()和reversed()的区别

Python入门必学&#xff1a;reverse()和reversed()的区别 &#x1f4c5;2024年02月25日 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

ABAP - Function ALV 05 添加选择框列、全选、取消全选

很多用户不习惯原生GRID的选择模式&#xff0c;所以业务需要用到自定义的选择框来进行数据的操作&#xff0c;显示效果如图所示&#xff0c;增加一条选择列&#xff0c;且配置全选和全选全选的按钮功能&#xff0c;如下图所示。 实现这种功能需要用到Fieldcat的参数控制以及GUI…

[02 git ] 清华大学电子系科协软件部2023暑期培训

本视频为清华大学电子系科协软件部2023年暑期培训内容的录屏&#xff0c;主要培训内容为游戏开发、网站建设中常用的软件工具&#xff0c;为未来一年软件部新部员维护科协网站、开发清华大学人工智能挑战赛&#xff08;THUAI&#xff09;作知识铺垫。本次培训还邀请到两位嘉宾讲…

Apache celeborn 安装及使用教程

1.下载安装包 https://celeborn.apache.org/download/ 测0.4.0时出现https://github.com/apache/incubator-celeborn/issues/835 2.解压 tar -xzvf apache-celeborn-0.3.2-incubating-bin.tgz 3.修改配置文件 cp celeborn-env.sh.template celeborn-env.shcp log4j2.xml.…

【PX4SimulinkGazebo联合仿真】在Simulink中使用ROS2控制无人机进入Offboard模式起飞悬停并在Gazebo中可视化

在Simulink中使用ROS2控制无人机进入Offboard模式起飞悬停并在Gazebo中可视化 系统架构Matlab官方例程Control a Simulated UAV Using ROS 2 and PX4 Bridge运行所需的环境配置PX4&Simulink&Gazebo联合仿真实现方法建立Simulink模型并完成基本配置整体框架各子系统实现…

人工智能绘画的时代下到底是谁在主导,是人类的想象力,还是AI的创造力?

#ai作画 目录 一.AI绘画的概念 1. 数据集准备&#xff1a; 2. 模型训练&#xff1a; 3. 生成绘画&#xff1a; 二.AI绘画的应用领域 三.AI绘画的发展 四.AI绘画背后的技术剖析 1.AI绘画的底层原理 2.主流模型的发展趋势 2.1VAE — 伊始之门 2.2GAN 2.2.1GAN相较于…

香港服务器掉包原因及处理方法

在使用香港服务器的过程中&#xff0c;有时会遇到“掉包”现象&#xff0c;即数据传输过程中数据包丢失或延迟。这不仅影响用户体验&#xff0c;还可能对企业运营造成不良影响。那么&#xff0c;香港服务器掉包的原因是什么?又该如何处理呢?小库评测将为您科普相关知识。 一、…

消息中间件篇之RabbitMQ-消息重复消费

一、导致重复消费的情况 1. 网络抖动。 2. 消费者挂了。 消费者消费消息后&#xff0c;当确认消息还没有发送到MQ时&#xff0c;就发生网络抖动或者消费者宕机。那当消费者恢复后&#xff0c;由于MQ没有收到消息&#xff0c;而且消费者有重试机制&#xff0c;消费者就会再一次消…

一招鲜吃遍天!ChatGPT高级咒语揭秘:记忆、洗稿、速写SEO文章(一)

🌟 摘要 🌟 这个专栏系列的初衷是针对特定痛点精心设计GPT提示词,在这篇文章中,我们深入探讨了利用GPT技术解决三个常见挑战:增强记忆力、内容创新、以及SEO文章速写的高级技巧。这些挑战分别对应三个独特的解决策略,我们将逐一详细解析。 首先,解决记忆增强的挑战,我…

聊聊JVM运行时数据区的堆内存

聊聊JVM运行时数据区的堆内存 内存模型变迁&#xff1a; Java堆在JVM启动时创建内存区域去实现对象、数组与运行时常量的内存分配&#xff0c;它是虚拟机管理最大的&#xff0c;也是垃圾回收的主要内存区域 。 内存模型变迁&#xff1a; 为什么要有年轻区和老年区&#xff1f;…

js逆向-2

#md5加密&#xff0c;某宝案例演示。 #免责声明:本文仅供学习使用&#xff0c;请勿用于其他违法行为(╥ω╥)

通过STM32F756 QSPI来读写数据

通过STM32F756 QSPI来读写数据 手上做了一款STM32F756IGT6的开发板&#xff0c;是网上的公板子&#xff0c;扩展了32MB SDRAM&#xff0c; 但QSPI有一个引脚是有错误&#xff0c; 后面找了出来&#xff0c; 同时引出了大量的IO接口&#xff0c;可以支持LCD&#xff0c;但我没有…

DHCP配置案例-通过DHCP Relay功能从DHCP Server获取IP地址

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle OC…

普中51单片机学习(LCD1602)

LCD1602 1602液晶也叫1602字符型液晶&#xff0c;它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若干个5x7或者5x10的点阵字符位组成&#xff0c;每个点阵字符位都可以用显示一个字符&#xff0c;每位之间有一个点距的间隔&#xff0c;每行之间也有间隔&#…

【《高性能 MySQL》摘录】第 2 章 MySQL 基准测试

文章目录 2.1 为什么需要基准测试2.2 基准测试的策略2.2.1 测试何种指标 2.3 基准测试方法2.3.1 设计和规划基准测试2.3.2 基准测试应该运行多长时间2.3.3 获取系统性能和状态2.3.4 获得准确的测试结果2.3.5 运行基准测试并分析结果2.3.6 绘图的重要性 2.4 基准测试工具…

win10安装使用AxurePR9

背景&#xff1a;win10 安装、汉化 Axure Pr9 下载 安装包 链接&#xff1a;https://pan.baidu.com/s/1taMgh2zLbaFK7VTfUXTHdQ 提取码&#xff1a;kygo 安装 修改安装目录 打开是英文的 汉化 复制lang包到Axure安装包 再打开就是中文 问题 发布html后火狐无法打开 一、…

Sublime Text4配置C#运行环境

这里写自定义目录标题 前言部署.NET环境Sublime Text4配置C#编译环境1. 下载插件 运行测试 前言 今天把家里的9年前的远古神机搬了出来&#xff0c;重装了个win7的精简版&#xff0c;本打算装个VScode测试一下是否能写C#代码&#xff0c;结果是可以的&#xff0c;但&#xff0…

第十四章 Linux面试题

第十四章 Linux面试题 日志t.log(访问量)&#xff0c; 将各个ip地址截取&#xff0c;并统计出现次数&#xff0c;并按从大到小排序(腾 讯) http://192. 168200.10/index1.html http://192. 168.200. 10/index2.html http:/192. 168 200.20/index1 html http://192. 168 200.30/…

python:xml.etree.ElementTree 读 Freeplane.mm文件,生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#xff0c;比如数学公式、节点属性面板等。 强大的节点功能&#xff0c;不仅仅节点的种类很多&#xf…