在开发时如何提高灵活性,在mysql使用Json是一个很好的方法,如何使用json提高开发灵活性涉及了大量的数据变量作存储,想到如果一个数据变量作为一个字段来存储的话效率太低,当某些数据为空时会造成大量的资源浪费,而MySQL从5.7版本之后开始支持JSON数据类型,

MySql中存储Json的几个特性:

1.存储在JSON列中的JSON文档的会被自动验证。无效的文档会产生错误;
2.最佳存储格式。存储在JSON列中的JSON文档会被转换为允许快速读取文档元素的内部格式。
3.存储在JSON列中的任何JSON文档的大小都受系统变量max_allowed_packet的值的限制,可以使用JSON_STORAGE_SIZE()函数获得存储JSON文档所需的空间。

将Json做字段存储到数据库中的优势:

json作为一种自带结构的文本使得结构信息与可以与数据库解耦。

首先在不使用json的时候,如果我们要设计一个User对象。则数据表中的信息如下:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

那我们设计的这个系统的Student的结构信息是这样传递的:

  • 表现层(html/css/anjular/reace/vue……):根据需求展示学生对象各个属性
  • 模型层(java/php/c++/pyhton……):处理用户对象
  • DAO层(Mybatis/Hibernate……):完成对象关系的映射
  • 持久层(MySql/SqlServer……):对各个字段进行存储

因此我们可以看到,在这个系统中,Student对象的结构信息是从表现层到持久层是完全贯通且一致的。这样的优点是提高了一致性,使得代码更容易阅读。但有一个重要的问题:耦合太高,扩展不灵活

假设我们要增加给Student对象增加一个属性age。那我们各个层都要进行修改,例如数据库层结构需要修改为:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

同时,其他各层都要进行修改。

而引入json进行存储之后。假设我们将主要信息字段id、name字段进行保留,而次要信息字段转为json。则数据表中的信息变为:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `detail` json(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

对于已经放入detail中的次要信息而言,Student的结构信息是这样传递的:

  • 表现层(html/css/anjular/reace/vue……):根据需求展示用户对象各个属性
  • 模型层(java/php/c++/pyhton……):进行json结构与模型的映射
  • DAO层(Mybatis/Hibernate……):无需完成属性与字段的映射
  • 持久层(MySql/SqlServer……):无需了解字段详情

这样,使得Student的次要结构信息可以与数据库解耦。当Student中再增加一个属性age时,我们只需要在模型层增加一个age属性,甚至连序列化操作都不需要变动就可以直接在表现层进行使用

NoSql数据库中的文档数据库便多用json进行数据存储,来实现与对象结构的解耦。而Mysql中使用json类型,其实是向这种方式的一种靠拢。我们可以:

  • 将经常查询的属性采用独立字段
  • 将不经常查询且变动频繁的字段存入json中

从而实现运行效率可扩展性之间的平衡。