版本1:事件表

流水ID

id

对象ID

obj_id

系统编码

sys_code

网点编码

area_code

操作者工号

operator_id

源状态

source_status

事件编码

event_code

事件描述

event_desc

目标状态

target_status

创建时间

create_time

123456A111TEST_SYSTEMXXX0123777初始 001 打印 打印完成 2018-09-06 18:33:35123457A111TEST_SYSTEMQQQ0123666 打印完成 002 核销 核销完成2018-09-07 12:05:43

在记录事件的 源状态 StateA时,一开始的做法是 获取其他业务数据表中某对象的当前状态,来设置事件记录表的源状态 。但在一些业务场景下,对于同一个事件编码event_code,虽然目标状态StateB是一样的,但是源状态StateA会有很多种情况,此时如果通过业务数据表的当前状态来设置源状态的值,会十分繁琐,而且业务代码上需要知道当前状态,不够透明。

基于上面情况,我们 不再从其他业务数据表中获取某对象的当前状态,而是依赖于事件记录表前后的数据 ,从版本1的表中,可看到,在按照创建时间排序的前提下,ID为123457的源状态(打印完成),就是上一条记录ID为123456的目标状态(目标状态)。所以 想要设置某对象的源状态,只要找到该对象在事件记录表中的上一条记录的目标状态即可

但这种方案,严重依赖于上一条记录,当有多个节点同时都往这个事件记录表插入数据时, 要对这“上一条记录”的数据进行锁定,需要采用分布式锁或者数据库锁的机制

再次改进:

认真想想,由于事件记录表是按照对象做动作时按时间顺序插入的,只要保证时间顺序,其实 可以不需要记录源状态,每条数据的目标状态,也相当于它上一条数据的源状态 。因此,我们对事件表进行改造,形成版本2:

版本2:事件表

流水ID

id

对象ID

obj_id

系统编码

sys_code

网点编码

area_code

操作者工号

operator_id

事件编码

event_code

事件描述

event_desc

目标状态

target_status

创建时间

create_time

123456A111TEST_SYSTEMXXX0123777 001 打印 打印完成 2018-09-06 18:33:35123457A111TEST_SYSTEMQQQ0123666 002 核销 核销完成2018-09-07 12:05:43

由于事件记录表本身的时间顺序的特性,所以版本2的表基本可以满足我们记录对象全生命周期的需求。还是版本1的需求,比如我们想知道对象A111从打印完成状态到核销完成状态所花费的时间,用sql更容易就实现了:

开始时间:

SELECT create_time AS begin_time FROM db_event_report WHERE obj_id = 'A111' AND target_status = '打印完成';

结束时间:

SELECT create_time AS end_time FROM db_event_report WHERE obj_id = 'A111' AND target_status = '核销完成';

然后将上面两条sql查询出来的begin_time和end_time套入以下sql函数,即可算出相隔的分钟数

SELECT TIMESTAMPDIFF(MINUTE, begin_time, end_time);

至此,我们的事件记录流水表设计结束。

performance_schema介绍 performance_schema是运行在较低级别的用于监控MySQL Server 运行过程中的资源消耗、资源等待等情况的一个功能特性,它具有以下特点。 performance_schema提供了一种在数据库运行时实时检查Server内部执 行情况的方法。performance_schema数据库中的 使用performance_schema存 储引擎。该数据库主要关注数据库运行过程中的性能相关数据。 performance_schema通过监视Serv 先分享一下拉链 的用途、什么是拉链 。 通过一些小的使用场景来对拉链 做近一步的阐释,以及拉链 和常用的切片 的区别。 举一个具体的应用场景,来 设计 并实现一份拉链 ,最后并通过一些例子说明如何使用我们 设计 的这张 (因为现在Hive的大规模使用 事件流 就是, 事件 传播的过程。 DOM中完整的 事件流 包括了三个阶段: 事件 捕获阶段、目标阶段和 事件 冒泡阶段 事件 通过捕获到达目标元素,这个时候就是目标阶段,从目标节点元素将 事件 上传到根节点的构成阶段,冒泡阶段 3、关于 事件 冒泡以及 事件 捕获 事件 冒泡,也就是自下而上,从目标触发的元素逐级向上传播,直至window对象 在阅读了this great Nettuts+ article的提示之后,我提出了一个 格模式,它将高度易失的数据与其他遭受严重读取的 进行分离,同时降低整个数据库模式所需的 数,但是我不是肯定这是一个好主意,因为它不遵循正常化规则,我想听听你的意见,这里是一般的想法:我有四种类型的用户建模在Class Table Inheritance结构中,在主“用户” 中,我存储所有用户(id,用户名,密码... 拉链 :维护历史状态,以及最新状态数据的一种 ,拉链 根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的 记录 而已,通过拉链 可以很方便的还原出拉链时点的客户 记录 流水 : 对于 的每一个修改都会 记录 ,可以用于反映实际 记录 的变更。 适用场景对比 拉链 通常是对账户信息的历史变动进行处理保留的结果, 流水 是每天的交易形成的历史; 流水 用于统计业务相关情况,拉链 用于统计账户及客户的情况 数据仓库之拉链 (原理、 设计 以及在Hive中的实现)         目前新功能在试点范围内上线试用,业务关心新功能的试用情况,需要对生产数据进行统计和汇总,以便跟旧功能在流程上做一些比较分析。我们需要配合的是,跟大数据团队一起,提供几个数据基 ,其中要有 一张 ,能够 记录 新功能的全生命周期。        统一抽象来说,解决的是:        谁(Who)什么时候(When)以什么身份(Role)在什么地点(Where),对什么东西(What)...