Mysql-动态字段存储方案
背景
在面向企业开发的系统中或者PASS平台的“动态字段存储问题”时,有时候会涉及到需要动态添加一个字段,我们都知道,在关系型数据库MySQL的数据库表修改表字段时,代价比较大,甚至出现锁表导致服务崩溃,下面提供了两种方法
动态结构
为了解决“动态结构”,可能会想到以下几种方法:
- 列模型:就是我们常说的“宽表”,就是我们一般在设计的时候会预留一些字段,但是预留的字段如果太少有时候不能满足需求,如果太长了会有一些冗余
- 行模型:以key-value结构作为一行存储到表中,每增加一个字段就增加一行数据,但是问题在于value定义类型智能是varchar,大小也需要限制
- NoSQL:利用NoSQL基于document类型的特性,可以方便的存储动态数据结构并且查询效率高,但是一方面不支持关系型数据库的事务概念,ACID的场景支持度不高,另一方面业务改造成本大。
- JSON模型:MySQL5.7以后支持JSON类型,可用于存储动态扩展字段,JSON类型的字段有以下几个特性:
- MySQL会对DML JSON数据自动验证。无效的DML JSON操作将会产生错误
- 优化的存储格式,存储JSON列中的JSON文档转换为一种内部格式,允许对Json元素进行快速读取访问
- MYSQL Json类型支持索引增加查询性能
- EAV模型:把实体-属性-值(Entity-Attribute-Value)分开表进行存储。实体表存储对象的ID和主要属性,属性表存储需要扩展的属性,值表由不同类型的表组成一个集合,一个值需要由实体ID+属性ID来确定,虽然EAV模型能够解决以上三种模型的缺点,有着灵活性强,完美解决数据稀疏性,但是因为太过复杂,查询性能也相对低下,必须为其提升性能做大量辅助工作。
实战操作
JSON类型操作教程
官方教程
https://dev.mysql.com/doc/refman/5.7/en/json.html
中文文档
https://www.docs4dev.com/docs/zh/mysql/5.7/reference/json.html
Mysql动态字段存储方案
http://example.com/2024/11/15/2022-07-28-MySQL动态字段存储方案/