使用mysql的XML Functions让mysql schema free

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: schema free 是mongodb里的一个重要的特性,很适合业务系统对某些非重点字段的维护,但是mongodb在运维上比mysql代价高,所以DBA也不会推荐使用。一般业务系统都默认使用成熟而又稳定的mysql。 但是,如何在mysql上实现schema free呢? # 横纵表方案 业务系统最常见的是横纵表方案 横表存储主要字段(用于查询、排序的字段) 纵表用 key-v

schema free 是mongodb里的一个重要的特性,很适合业务系统对某些非重点字段的维护,但是mongodb在运维上比mysql代价高,所以DBA也不会推荐使用。一般业务系统都默认使用成熟而又稳定的mysql。

但是,如何在mysql上实现schema free呢?

横纵表方案

业务系统最常见的是横纵表方案
横表存储主要字段(用于查询、排序的字段)
纵表用 key-value的形式存储非主要字段

而当业务需要获取一个实体时,需要在业务代码中这样处理

1.查询主表
select * from main_table where id=?

2.查询纵表
select key,value from vertical_table where obj_id=?

3.然后将这个kv结果集合塞回到实体中,然后返回

这样做当然可以满足要求,但是,逻辑的复杂度增加了,不但是查询,新建、更新、删除都需要操作2张表去完成。

XML Functions方案

当我看到了mysql的XML Functions后,突然感到世界打开了一扇新的窗,完全可以通过它来实现schema free。

XML Functions 的两个函数

Name Description
ExtractValue() Extracts a value from an XML string using XPath notation
UpdateXML() Return replaced XML fragment

用法

SELECT ExtractValue(memo, '/e') AS val1 FROM table1

这样可以查询table1表中的memo字段里中间的内容

update table1 set memo=UpdateXML(memo, '/e', '<e>fff</e>') 

可以更新table1 表中memo字段中的中间的内容为fff

我们需要做的,只需要纵表的表中增加一个大字段(varchar(1000)?大小自己预估),然后在这个大字段存储非主要信息

能再简单一点吗?

事情到这里是不是完成了呢?
写这样繁琐的sql是不是有点复杂啊?

于是我写了一个myibatis的拦截器,封装的xml的操作,让使用方感觉是在操作横表一样去操作大字段

比如:
id,title 和横表字段,大字段是memo,author是xml节点

Select

查询时只要输入sql

select id,title,_memo_author from tb

就可以完成查询,当然,在拦截器中将它转换成了

select id,title,ExtractValue(memo, '/author')from tb

通过myibatis的orm可以将大字段中的节点直接映射到对象属性上

Insert

insert操作也一样

insert into tb (id,title,_memo_author) values(1,'interstellar','buming.pl')

Update

update tb set id=1,title='interstellar',_memo_author='buming.pl'

author节点如果不存在,会在xml中新加,如果存在,会修改

下面这个是jar包

<dependency>
  <groupId>com.taobao</groupId>
  <artifactId>interstellar</artifactId>
  <version>1.1.0</version>
</dependency>

只需要在myibatis拦截器列表中增加拦截器

<property name="plugins">
    <list>
                <bean class="com.taobao.interstellar.InterstellarInterceptor">
                    <property name="properties">
                       <!-- memo:纵表大字段,defaultPrefix:前缀,defaultSuffix:后缀 -->
                        <value>
                            defaultColumn=memo
                            defaultPrefix=_
                            defaultSuffix=_
                        </value>
                    </property>
                </bean>
    </list>
</property>

更新列表

1.1.0

1、拦截器不作用在prepare阶段,改到 Executor 接口
2、sql解析在第一次注册为sqlmap,以后直接调用
3、对象不在需要memo属性,通过cglib动态添加
4、加入 处理特殊字符

1.0.3

修复了如果更新字段为空时,更新不成功bug 

参考资料:

XML Functions 的文档 http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
XML 关系型数据库 MySQL
【Mysql】有关数据库中一对多/一对一,多对一xml中文件映射问题
【Mysql】有关数据库中一对多/一对一,多对一xml中文件映射问题
124 0
|
9月前
|
存储 缓存 关系型数据库
MySQL进阶突击系列(08)年少不知BufferPool核心原理 | 大哥送来三条大金链子LRU、Flush、Free
本文深入探讨了MySQL中InnoDB存储引擎的buffer pool机制,包括其内存管理、数据页加载与淘汰策略。Buffer pool作为高并发读写的缓存池,默认大小为128MB,通过free链表、flush链表和LRU链表管理数据页的存取与淘汰。其中,改进型LRU链表采用冷热分离设计,确保预读机制不会影响缓存公平性。文章还介绍了缓存数据页的刷盘机制及参数配置,帮助读者理解buffer pool的运行原理,优化MySQL性能。
|
XML Java 关系型数据库
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
|
XML 数据格式
DTD和XML Schema之间的区别?
【8月更文挑战第22天】
223 0
|
XML Java 数据库连接
MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql
MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql
|
XML 数据格式
XML Schema 复杂元素类型详解:定义及示例解析
在XML Schema(XSD)中,复杂元素包含其他元素和/或属性,分为4类:空元素、仅含元素、仅含文本和既含元素也含文本。定义复杂元素可通过直接声明或引用预定义的复杂类型。复杂空元素仅含属性,而仅含元素的类型则只包含其他子元素。XSD提供了`&lt;xs:sequence&gt;`、`&lt;xs:all&gt;`、`&lt;xs:choice&gt;`等指示器来规定元素顺序和出现次数,以及`&lt;xs:attributeGroup&gt;`和`&lt;xs:group&gt;`来组织元素和属性。
397 7
|
Java 数据库连接 mybatis
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
|
XML 数据格式
XML Schema 字符串数据类型及约束详解
XML中的字符串数据类型表示字符序列,包括换行、回车和制表符。处理器不修改值。`normalizedString`去除这些特殊字符,`token`则进一步移除前导和尾随空格及多余空格。字符串类型可使用枚举、长度等限制。`date`和`dateTime`数据类型表示日期和时间,`duration`表示时间间隔。数值类型如`decimal`和`integer`用于数值,布尔型表示真或假。还有如`base64Binary`和`anyURI`等其他数据类型。元素和数据类型可以有各种约束,如最大值、最小值和模式匹配。
240 0
|
XML JavaScript 数据格式
XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南
XML Schema(XSD)是用于定义XML文档结构的规范,它描述了元素、属性及其顺序、数据类型和约束。与DTD相比,XML Schema支持更多数据类型,如字符串、日期等,并且是基于XML的,允许扩展和重用。学习XML Schema有助于确保数据通信时双方对内容的理解一致,通过验证防止错误。示例展示了如何定义一个`note`元素,包含`to`, `from`, `heading`和`body`子元素,都是字符串类型。XML文档可以通过引用XML Schema进行验证,确保内容符合预设模式。
1330 0

推荐镜像

更多