当前位置: 首页 > news >正文

数据生命周期管理的初步设计

这是学习笔记的第 1995 篇文章


  之前做了一个初版的生命周期设计,导致对于实现的难度低估,在实际设计的时候,碰到了一些意料之外的边界问题。 

在和前端业务部门做了几次沟通之后,从数据的管理角度需要进一步的规范设计。 

    所以从难度上来说,低估会导致我有成倍的工作量,当然目标都立项了,再苦再累也得含着泪做完。

    对于整个生命周期的管理,我做了如下的流程设计。

    其中数据的抽取是周期性的,而数据管理的粒度则是分为表,字段,索引,然后根据这些粒度延伸出相关的变更历史信息。

    在这个基础上可以扩展出一些功能,比如某个业务就对某个表的数据变化格外关注,那么它可以订阅这个数据变化,或者是和工单的数据打通,让数据的变化和流程内,流程外的变更关联起来。

    对外提供的数据服务,是使用API的方式,提供变更列表的查询,对象变更的查询和相关的轨迹树。

640?wx_fmt=png

  • 覆盖场景

整个生命周期管理中,需要覆盖以下的一些场景:

1)新增表

2)删除表

3)表变更

a) 字段变更

b) 索引变更

  • 应用场景

对后端管理来说,可以提供一个完整的列表信息,

l 模糊查看

1)根据时间维度来查看最近哪些表结构发生了变更,该接口暂不对外

² 精确查看

对于业务来说,可以提供基础的IP,端口信息,提供两种维度的查询,显示的是完整的列表,比如数据库test在2月10日包含10张表,2月12日新增了2张表,2月17日删除了1张表,变更表之间彼此没有关联

² 查询范围是2月10日之前,则显示10张表,状态为有效

² 查询范围是2月10日~2月12日,显示12张表信息,状态为有效

² 查询范围是2月12日~2月17日,显示12张表信息,其中11个为有效,1个为失效

² 查询范围是2月17日以后,显示12张表信息,其中11个为有效,1个为失效

查询范围默认为近3天,支持如下两种维度的查询:

根据对象维度来查看一个时间范围内的“数据库-表”列表

根据时间维度来查看一个时间范围内的“数据库-表“列表

对于时间的测试是其中的一个重点,如下是一些测试的日志,主要通过如下的方式来进行对比发现create_time,update_time的变化规律。

mysql--root@localhost:test 19:07:10>>drop table test_tab;

Query OK, 0 rows affected (0.01 sec)

mysql--root@localhost:test 19:08:16>>create table test_tab(id int primary key,name varchar(30),memo varchar(50));

Query OK, 0 rows affected (0.02 sec)

mysql--root@localhost:test 19:08:23>>show create table test_tab;

| test_tab | CREATE TABLE `test_tab` (

  `id` int(11) NOT NULL,

  `name` varchar(30) DEFAULT NULL,

  `memo` varchar(50) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

1 row in set (0.00 sec)

mysql--root@localhost:test 19:08:47>>select *from information_schema.tables where table_name='test_tab' and table_schema='test'\G

*************************** 1. row ***************************

  TABLE_CATALOG: def

   TABLE_SCHEMA: test

     TABLE_NAME: test_tab

     TABLE_TYPE: BASE TABLE

         ENGINE: InnoDB

        VERSION: 10

     ROW_FORMAT: Dynamic

     TABLE_ROWS: 0

 AVG_ROW_LENGTH: 0

    DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

   INDEX_LENGTH: 0

      DATA_FREE: 0

 AUTO_INCREMENT: NULL

    CREATE_TIME: 2019-05-28 19:08:23

    UPDATE_TIME: NULL

     CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

       CHECKSUM: NULL

 CREATE_OPTIONS: 

  TABLE_COMMENT: 

1 row in set (0.00 sec)

mysql--root@localhost:test 19:08:55>>alter table test_tab add unique key idx_test_name(name);

Query OK, 0 rows affected (0.02 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql--root@localhost:test 19:09:16>>select *from information_schema.tables where table_name='test_tab' and table_schema='test'\G

*************************** 1. row ***************************

  TABLE_CATALOG: def

   TABLE_SCHEMA: test

     TABLE_NAME: test_tab

     TABLE_TYPE: BASE TABLE

         ENGINE: InnoDB

        VERSION: 10

     ROW_FORMAT: Dynamic

     TABLE_ROWS: 0

 AVG_ROW_LENGTH: 0

    DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

   INDEX_LENGTH: 0

      DATA_FREE: 0

 AUTO_INCREMENT: NULL

    CREATE_TIME: 2019-05-28 19:09:16

    UPDATE_TIME: NULL

     CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

       CHECKSUM: NULL

 CREATE_OPTIONS: 

  TABLE_COMMENT: 

1 row in set (0.00 sec)

mysql--root@localhost:test 19:09:31>>alter table test_tab drop column memo;

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql--root@localhost:test 19:09:50>>select *from information_schema.tables where table_name='test_tab' and table_schema='test'\G

*************************** 1. row ***************************

  TABLE_CATALOG: def

   TABLE_SCHEMA: test

     TABLE_NAME: test_tab

     TABLE_TYPE: BASE TABLE

         ENGINE: InnoDB

        VERSION: 10

     ROW_FORMAT: Dynamic

     TABLE_ROWS: 0

 AVG_ROW_LENGTH: 0

    DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

   INDEX_LENGTH: 16384

      DATA_FREE: 0

 AUTO_INCREMENT: NULL

    CREATE_TIME: 2019-05-28 19:09:50

    UPDATE_TIME: NULL

     CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

       CHECKSUM: NULL

 CREATE_OPTIONS: 

  TABLE_COMMENT: 

1 row in set (0.00 sec)

mysql--root@localhost:test 19:10:01>>insert into test_tab values(1,'aa');

Query OK, 1 row affected (0.01 sec)

mysql--root@localhost:test 19:10:10>>select *from information_schema.tables where table_name='test_tab' and table_schema='test'\G

*************************** 1. row ***************************

  TABLE_CATALOG: def

   TABLE_SCHEMA: test

     TABLE_NAME: test_tab

     TABLE_TYPE: BASE TABLE

         ENGINE: InnoDB

        VERSION: 10

     ROW_FORMAT: Dynamic

     TABLE_ROWS: 1

 AVG_ROW_LENGTH: 16384

    DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

   INDEX_LENGTH: 16384

      DATA_FREE: 0

 AUTO_INCREMENT: NULL

    CREATE_TIME: 2019-05-28 19:09:50

    UPDATE_TIME: 2019-05-28 19:10:10

     CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

       CHECKSUM: NULL

 CREATE_OPTIONS: 

  TABLE_COMMENT: 

1 row in set (0.01 sec)

mysql--root@localhost:test 19:10:20>>insert into test_tab values(2,'bb');

Query OK, 1 row affected (0.00 sec)

mysql--root@localhost:test 19:10:40>>select *from information_schema.tables where table_name='test_tab' and table_schema='test'\G

*************************** 1. row ***************************

  TABLE_CATALOG: def

   TABLE_SCHEMA: test

     TABLE_NAME: test_tab

     TABLE_TYPE: BASE TABLE

         ENGINE: InnoDB

        VERSION: 10

     ROW_FORMAT: Dynamic

     TABLE_ROWS: 2

 AVG_ROW_LENGTH: 8192

    DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

   INDEX_LENGTH: 16384

      DATA_FREE: 0

 AUTO_INCREMENT: NULL

    CREATE_TIME: 2019-05-28 19:09:50

    UPDATE_TIME: 2019-05-28 19:10:40

     CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

       CHECKSUM: NULL

 CREATE_OPTIONS: 

  TABLE_COMMENT: 

1 row in set (0.00 sec)

mysql--root@localhost:test 19:10:45>>delete from test_tab where id=1;

Query OK, 1 row affected (0.01 sec)

mysql--root@localhost:test 19:10:59>>select *from information_schema.tables where table_name='test_tab' and table_schema='test'\G

*************************** 1. row ***************************

  TABLE_CATALOG: def

   TABLE_SCHEMA: test

     TABLE_NAME: test_tab

     TABLE_TYPE: BASE TABLE

         ENGINE: InnoDB

        VERSION: 10

     ROW_FORMAT: Dynamic

     TABLE_ROWS: 1

 AVG_ROW_LENGTH: 16384

    DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

   INDEX_LENGTH: 16384

      DATA_FREE: 0

 AUTO_INCREMENT: NULL

    CREATE_TIME: 2019-05-28 19:09:50

    UPDATE_TIME: 2019-05-28 19:10:59

     CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

       CHECKSUM: NULL

 CREATE_OPTIONS: 

  TABLE_COMMENT: 

1 row in set (0.00 sec)

mysql--root@localhost:test 19:11:10>>update test_tab set name='ccc' where id=2;

Query OK, 1 row affected (0.02 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql--root@localhost:test 19:11:28>>select *from information_schema.tables where table_name='test_tab' and table_schema='test'\G

*************************** 1. row ***************************

  TABLE_CATALOG: def

   TABLE_SCHEMA: test

     TABLE_NAME: test_tab

     TABLE_TYPE: BASE TABLE

         ENGINE: InnoDB

        VERSION: 10

     ROW_FORMAT: Dynamic

     TABLE_ROWS: 1

 AVG_ROW_LENGTH: 16384

    DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

   INDEX_LENGTH: 16384

      DATA_FREE: 0

 AUTO_INCREMENT: NULL

    CREATE_TIME: 2019-05-28 19:09:50

    UPDATE_TIME: 2019-05-28 19:11:28

     CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

       CHECKSUM: NULL

 CREATE_OPTIONS: 

  TABLE_COMMENT: 

1 row in set (0.01 sec)

mysql--root@localhost:test 19:11:37>>update test_tab set name='aaaaaa' where id=100;

Query OK, 0 rows affected (0.00 sec)

Rows matched: 0  Changed: 0  Warnings: 0

mysql--root@localhost:test 19:12:13>>select *from information_schema.tables where table_name='test_tab' and table_schema='test'\G

*************************** 1. row ***************************

  TABLE_CATALOG: def

   TABLE_SCHEMA: test

     TABLE_NAME: test_tab

     TABLE_TYPE: BASE TABLE

         ENGINE: InnoDB

        VERSION: 10

     ROW_FORMAT: Dynamic

     TABLE_ROWS: 1

 AVG_ROW_LENGTH: 16384

    DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

   INDEX_LENGTH: 16384

      DATA_FREE: 0

 AUTO_INCREMENT: NULL

    CREATE_TIME: 2019-05-28 19:09:50

    UPDATE_TIME: 2019-05-28 19:11:28

     CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

       CHECKSUM: NULL

 CREATE_OPTIONS: 

  TABLE_COMMENT: 

1 row in set (0.01 sec)

mysql--root@localhost:test 19:12:18>>select *from test_tab;

+----+------+

| id | name |

+----+------+

|  2 | ccc  |

+----+------+

1 row in set (0.00 sec)

mysql--root@localhost:test 19:12:27>>update test_tab set name='ccc' where id=2;

Query OK, 0 rows affected (0.00 sec)

Rows matched: 1  Changed: 0  Warnings: 0

mysql--root@localhost:test 19:12:39>>select *from information_schema.tables where table_name='test_tab' and table_schema='test'\G

*************************** 1. row ***************************

  TABLE_CATALOG: def

   TABLE_SCHEMA: test

     TABLE_NAME: test_tab

     TABLE_TYPE: BASE TABLE

         ENGINE: InnoDB

        VERSION: 10

     ROW_FORMAT: Dynamic

     TABLE_ROWS: 1

 AVG_ROW_LENGTH: 16384

    DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

   INDEX_LENGTH: 16384

      DATA_FREE: 0

 AUTO_INCREMENT: NULL

    CREATE_TIME: 2019-05-28 19:09:50

    UPDATE_TIME: 2019-05-28 19:11:28

     CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

       CHECKSUM: NULL

 CREATE_OPTIONS: 

  TABLE_COMMENT: 

1 row in set (0.01 sec)

640?

相关文章:

  • 颠覆我们的,可能就是那些差不多的事情
  • 因子分析的一个小例子
  • 最近在读的文章
  • 简单线性回归分析
  • 2000天带给我的回忆
  • 建模能力是进阶的必备技能
  • 推荐几个统计数据的网站
  • 相关分析的简单示例
  • 一些用户画像数据
  • 使用Shell脚本来解析MySQL元数据变化
  • 初来北京几年的精神状态
  • 磨刀不误砍柴工-流程梳理
  • 一个MySQL连接问题的优化过程
  • 认知的偏差
  • 迁移到MySQL的架构演进(一)
  • [Vue CLI 3] 配置解析之 css.extract
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【mysql】环境安装、服务启动、密码设置
  • JavaScript实现分页效果
  • JavaWeb(学习笔记二)
  • Java超时控制的实现
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS数组方法汇总
  • node-glob通配符
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 入门级的git使用指北
  • 使用 QuickBI 搭建酷炫可视化分析
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 一道面试题引发的“血案”
  • 一个项目push到多个远程Git仓库
  • 在weex里面使用chart图表
  • mysql面试题分组并合并列
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • Semaphore
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • $().each和$.each的区别
  • (2020)Java后端开发----(面试题和笔试题)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Matlab)使用竞争神经网络实现数据聚类
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (学习日记)2024.01.19
  • (一)Linux+Windows下安装ffmpeg
  • (转)创业的注意事项
  • ... 是什么 ?... 有什么用处?
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 4.0中的泛型协变和反变
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • /3GB和/USERVA开关
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [C++]:for循环for(int num : nums)