1、背景

在项目刚刚进入开发阶段设计表时,后期表的字段很可能会增加,可以设计出预留字段来应对。但是假如你的数据数据非常庞大且,那么执行修改表语句时会长时间锁表。而且假如一张表支持许多个客户,每个客户的需求不相同且多变时,使用一张表也无法满足需求。这时可以使用Mysql存储key/value数据满足不同客户需求。

2、Key/Value表设计

以Key/Value存储数据肯定不是Mysql的存储常态,但是可以应对一些灵活多变的场景。以下就是使用Key/Value的例子,先创建要给order订单表,再创建订单表的扩展字段。创建好Key/Value表之后可以为不同的客户配置不同的扩展字段属性和值。

CREATE TABLE `order` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(255) DEFAULT NULL,`description` text,`quantity` bigint(20) unsigned DEFAULT NULL COMMENT '数量',`amount` decimal(22,2) DEFAULT NULL COMMENT '金额',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=337411 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;CREATE TABLE `order_extend` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`order_id` bigint unsigned NOT NULL COMMENT '订单id',`extendfield_code` varchar(255) NOT NULL COMMENT '扩展字段属性',`extendfield_value` text COMMENT '扩展字段值',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

3、对象和HashMap相互转化

在设计了Key/Value扩展字段表之后,在某些业务场景为了方便处理扩展字段,可以将对象转化为Map进行操作,一个Map的所有key就是对象的所有字段,value就是对象字段所对应的值。以下是操作Key/Value数据案例操作:

    public void example(Long id) {//查到id对应的订单Order order = orderMapper.selectByPrimaryKey(id);//将对象属性转化为map集合Map<String, Object> map = JSON.parseObject(JSONObject.toJSONString(order), HashMap.class);//查到对应的扩展字段listList<OrderExtend> orderExtends = orderExtendMapper.select(id);for (OrderExtend orderExtend : orderExtends) {//将扩展字段放入map中map.put(orderExtend.getExtendFieldCode(),orderExtend.getExtendFieldValue());}//......//对map一顿操作//......//将map集合中的数据转化为指定对象的同名属性中Order updateOrder = JSON.parseObject(JSONObject.toJSONString(map), EventOrder.class);//更新订单信息eventOrderMapper.updateByPrimaryKey(updateOrder);//遍历出map中的扩展字段进行更新for (Map.Entry<String, Object> entry : map.entrySet()) {if (entry.getKey().startsWith("extendField_")) {OrderExtend  orderExtend  = new OrderExtend ();orderExtend.setOrderId(updateOrder.getId());orderExtend.setExtendFieldCode(entry.getKey());orderExtend.setExtendFieldValue(entry.getValue());update(orderExtend);}}}
  • HashMap和对象之间的转化还可以通过使用org.springframework.cglib.beans.BeanMap类中的方法,转化效率高。使用BeanMap进行对象和HashMap的转化:
//将map集合中的数据转化为指定对象的同名属性中public static <T> Map<String, Object> beanToMap(T bean) {Map<String, Object> map = new HashMap<>();if (bean != null) {BeanMap beanMap = BeanMap.create(bean);for (Object key : beanMap.keySet()) {map.put(key+"", beanMap.get(key));}}return map;}//将对象属性转化为map集合public static <T> T mapToBean(Map map,Class<T> clazz) throws Exception {T bean = clazz.newInstance();BeanMap beanMap = BeanMap.create(bean);beanMap.putAll(map);return bean;}

Mysql使用Key/Value方式存储动态扩展字段、对象与HashMap的相互转化相关推荐

  1. 不改表结构如何动态扩展字段

    笔者的动态字段扩展解决方案主要针对 Mysql 5.7.8 以下版本,在 Mysql 5.7.8 已经新增 JSON Data Type,同样适用该方案,而且情况变得更加简单. 痛点 软件行业唯一不变 ...

  2. java笔记之数组的概念、声明、初始化、访问方式、复制和动态扩展算法以及递归...

    1.数组的概念: 一组相同类型的数据堆积在一起 2.数组的声明: 1)数据类型 [] 数组名: 2)数据类型 数组名[]:(不推荐) 注:数据类型 可以使简单数据类型,也可以使引用数据类型 简单数据类 ...

  3. mysql动态扩展_动态可扩展查询MYSQL5.7JSON+虚拟列+Mybatis

    背景:现有业务扩展字段,都存在feature字段,存在语义不清晰以及,难以利用索引查询问题 Mysql 5.7后推出利器,JSON+虚拟列,即实现了业务语义统一,也支持索引查询加速 一.简单描述 My ...

  4. mysql数据存储方式_数据存储在mysql的两种方式

    数据存储在mysql的两种方式 发布时间:2020-05-12 16:16:25 来源:亿速云 阅读:250 作者:三月 下文主要给大家带来数据存储在mysql的两种方式,希望这些内容能够带给大家实际 ...

  5. Mysql insert 多种使用方式(insert into/insert ignore /replace into/on deplicate key update)

    Mysql insert 多种使用方式(insert into/insert ignore /replace into/on deplicate key update) 1 insert into t ...

  6. mysql 密码文件改成密文_需求:实现数据库密码通过密文的方式存储在配置文件中 | 学步园...

    需求:实现数据库密码通过密文的方式存储在配置文件中 配置文件:evoucher.conf[可以是任意自定义格式结尾的配置文件]格式 是以  Key:Value存在的. 例如如下: # evoucher ...

  7. MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)

    MySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的"存储引擎"(storage_engine)呢?有时候面试题中也会问道MySQL几种常用的存储引 ...

  8. mysql一共有多少引擎_MySQL存储引擎你们知道多少?

    MySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的"存储引擎"(storage_engine)呢?有时候面试题中也会问道MySQL几种常用的存储引 ...

  9. MySQL:指定索引+事务+存储引擎的配置 开发必备 天呐!为什么会有索引这种东西

    来来来,我告诉你为什么要有索引 索引的概念 索引的作用 索引的分类 普通索引创建的三种方式与删除 创建唯一索引与创建的三种方式 主键索引与创建的两种方式 组合索引 全文索引 创建索引的原则依据 事务的 ...

最新文章

  1. XSS漏洞自动化攻击工具XSSer
  2. python如何查询数据库_Python数据库操作手册-数据库专栏,SQL Server
  3. 别再用假任务做小样本学习实验了!来试试这个全新基准数据集
  4. MPU和CPU有什么区别?
  5. .NET 中 async 和 await
  6. P4859-已经没有什么好害怕的了【容斥,dp】
  7. 比特币中的密码学知识汇总
  8. 数据结构中为什么输入数据还没输入完全就结束了_我岂能忍!面试官居然用数据结构和算法“羞辱”我...
  9. php多添件分页查询,ThinkPHP的多表查询+分页范例
  10. 微信小程序云开发视频教程上线啦
  11. 686. Repeated String Match
  12. mcgs 施耐德tm218 变频器cv3100通过modbus连接控制
  13. 生信分析是个什么玩意儿?
  14. “黑桃A” 11月19日团队实训总结
  15. 用opencv和python读取医学图片:mha
  16. 育英oj——LZY逃命路线总数
  17. uva 437 巴比伦塔(DAG上dp)
  18. 【深入理解C++】头文件防卫式声明
  19. Wilcoxon符号秩检验
  20. centos7设置Java服务开机自启

热门文章

  1. 六轴机器人轨迹规划之五段位置s曲线插补
  2. java数组初始化的方式,java中初始化数组的方式有几种
  3. docker 安装Oracle12 (absolutapps/oracle-12c-ee )(无废话版)---------------(六)
  4. matlab电路元件二极管,(强烈推荐)基于Matlab的电子线路的设计与仿真_毕业论文
  5. iOS开发基础:最新的APP打包上架流程
  6. syn flood攻击原理及防范
  7. 社会人文跨计算机考研,各位跨专业考研党,不要违反这个规则,不然结果会让人遗憾...
  8. 如何“快准狠”的找到内存的问题
  9. PIL.image保存图片
  10. 爪哇国新游记之十五----泛型动态数组类