Решение автора по расширению динамического поля предназначено в основном для Mysql 5.7.8 и ниже, которое было добавлено в Mysql 5.7.8.JSON Data TypeЭто решение также применимо, и ситуация проще.
Болевые точки
Единственная константа в индустрии программного обеспечения — это изменения.Например, после запуска функции заказчику или PM необходимо добавить какие-то обоснованные требования к существующей функции, а выполнение этих задач должно решаться добавлением полей, либо реализация некоторых функций требует добавления полей для уменьшения сложность реализации и др. Эти проблемы изменят структуру таблицы базы данных на линии.После внесения изменений таблица будет заблокирована, и все операции записи будут ждать, пока блокировка таблицы не будет закрыта.Особенно для горячей таблицы с большим объемом данных, добавление поле может быть Таблица блокировки слишком длинная, что приводит к тайм-ауту некоторых запросов, что может привести кКосвенные экономические потери предприятий.
решение
Добавлены добавочные поля в формате JSON.
Решение описано ниже с некоторым кодом, который легко понять читателям.
Скрипт базы данных mysql:
DROP TABLE IF EXISTS `cs_dustbin`;
CREATE TABLE IF NOT EXISTS `cs_dustbin` (
`id` VARCHAR(45) NOT NULL COMMENT '主键自增id',
`rfid_no` VARCHAR(20) NOT NULL COMMENT 'rfid 卡号',
`state` INT(1) NOT NULL COMMENT '垃圾桶状态:0:已注销;1:未使用;2:待使用;3:已使用(绑定收集点);',
`user_id` INT NOT NULL COMMENT '登记人,负责录入垃圾桶的人',
`type` INT(1) NOT NULL DEFAULT 1 COMMENT '垃圾桶类型:1:餐厨垃圾桶',
`street_code` INT(11) DEFAULT NULL COMMENT '所在镇街 code,根据状态,这里的含义可能是领用镇街、退还镇街。',
`create_time` DATETIME NOT NULL DEFAULT now() COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT now() COMMENT '更新时间',
`ext` VARCHAR(1000) NOT NULL DEFAULT '{}' COMMENT '扩展字段',
...
PRIMARY KEY (`id`))
ENGINE = InnoDB
COMMENT = '垃圾桶表';
Java-код:
import com.alibaba.fastjson.JSON;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
/**
* 垃圾桶实体
* Created by Blink on 6/28/2018 AD.
*
* @author Blink
*/
@Data
public class Dustbin {
private String id;
/**
* rfid 卡号
*/
@NotNull
private String rfidNo;
/**
* 垃圾桶状态:0:已注销;1:未使用;2:待使用;3:已使用(绑定收集点);
* 对应 Dustbin.StateEnum 类
*/
@NotNull
private Integer state;
/**
* 录入垃圾桶的人员id
*/
@NotNull
private Long userId;
/**
* 垃圾桶类型:1:餐厨垃圾桶
* DefaultValue: 1
*/
@NotNull
private Integer type;
/**
* 所在镇街 code
* 根据状态,这里的含义可能是领用镇街、退还镇街
*/
private Integer streetCode;
/**
* 创建时间
* defaultValue : now()
*/
@NotNull
private Date createTime;
/**
* 更新时间
*/
@NotNull
private Date updateTime;
/**
* 扩展字段,详细数据查看 DustbinExt.java
* DefaultValue: {}
*/
private String ext;
...
public DustbinExt getExtObject() {
return JSON.parseObject(this.getExt(), DustbinExt.class);
}
public void setExtObject(DustbinExt ext) {
this.ext = JSON.toJSONString(ext);
}
/**
* 垃圾桶扩展属性
* Created by Blink on 6/28/2018 AD.
*
* @author Blink
*/
@Data
public static class DustbinExt {
/**
* 所在镇街
* 根据状态,这里的含义可能是领用镇街、退还镇街、绑定的镇街
*/
private String street;
/**
* 客户(收集点)id,绑定收集点的时候需要填入
* 根据目前的需求(2018-06-29),当收集点解绑的时候
* 需要保存垃圾桶最新绑定收集点名称,所以在解绑垃圾桶的时候不会把这个信息删掉
* 只有当绑定收集点的时候才把他覆盖
*/
private Long customerId;
/**
* 客户(收集点)名称,绑定收集点的时候需要填入
* 根据目前的需求(2018-06-29),当收集点解绑的时候
* 需要保存垃圾桶最新绑定收集点名称,所以在解绑垃圾桶的时候不会把这个信息删掉
* 只有当绑定收集点的时候才把他覆盖
*/
private String customer;
/**
* 损坏部位
* 1:桶盖;2:桶口;3:桶身;4:桶轴;5:桶底;6:桶轮;
* 对应 DustbinDamagePartEnum 类
*/
private List<Integer> parts;
}
...
}
Скрипт mysql может видеть информацию расширенного поля:
ext VARCHAR(1000) NOT NULL DEFAULT '{}' COMMENT '扩展字段'
Вы можете увидеть этот фрагмент кода Java:
...
/**
* 扩展字段,详细字段查看 DustbinExt 类
* DefaultValue: {}
*/
private String ext;
public DustbinExt getExtObject() {
return JSON.parseObject(this.getExt(), DustbinExt.class);
}
public void setExtObject(DustbinExt ext) {
this.ext = JSON.toJSONString(ext);
}
...
можно увидетьext
Поля используются для хранения данных в формате json, можно динамически добавлять любые поля, даже объекты, не пропускаяDDL (язык определения данных)Для создания полей очень подходит для решения упомянутых выше проблем.
Код Java играет здесь вспомогательную роль, определяявнутренний классЧтобы управлять атрибутами полей расширения, нам удобно понимать и управлять полями расширения, а также улучшать читаемость и удобство обслуживания кода.Этот метод java также является более элегантным подходом (личная точка зрения), резюмируемым Автор.
ограничение
Опытные читатели могут подсказать,ext
Поля не могут быть проиндексированы поле расширения определенной части поля или в следующих версиях Mysql 5.7.8, Mysql начиная с версии 5.7.8 не поддерживает следующее (Mysql 5.7.8 поддерживает индексирование для типа данных Json.).
Да, это ограничение этого решения, в Mysql 5.7.8, мое предложение:ext
Не храните данные об горячих точках в расширенных полях, сохраняйте только данные, не относящиеся к горячим точкам., чтобы вы могли избежать операций с запросами и сократить объем обслуживанияext
Стоимость и риск, связанные с полем, как определить, является ли новое поле горячими данными? Об этом нужно судить исходя из реальных бизнес-потребностей, либо можно спросить у более опытных в бизнесе и технологиях коллег, чтобы читатели могли быстрее сделать выводы.
Окончательное решение
В некоторых крайних случаях изменение может произойти слишком быстро, и мы хотим снизить стоимость и риск, связанные с изменением, поэтому в начале проектирования часов мы можем использовать свой собственный опыт или обратиться за помощью. более опытные люди, прикиньте Глядя на то, сколько запасных полей нужно зарезервировать, в сочетании с полями расширения, количество раз изменения (добавления полей) структуры таблицы можно в принципе сократить до очень небольшого количества раз.
Суммировать
В особых случаях, расширяя поля + зарезервированные поля, в принципе можно динамически расширять поля, не затрагивая индексацию горячих данных, Таким образом, мы получаем очень гибкую структуру таблицы, в которой нам удобно иметь дело с будущими изменениями. ,Но будьте осторожны, чтобы поддерживать нашу сущность, включая каждое ее поле, и уважайте каждую строку кода.