拉链表概念
想象一下,你有一张用户表,每天用户的某些信息(比如昵称、等级)都会发生变化。你想要记录下用户每天的变化情况,传统的做法是每天全量覆盖用户表,但这会浪费很多存储空间,因为大部分数据其实没有变化。
拉链表设计的思路是,只记录数据变化的区间,就像一条拉链一样,每个齿轮记录着一段时间的有效数据。
Postgresql数据库拉链表设计拉链表设计
一般来说,拉链表会有以下几个关键字段:
主键 (id): 用于标识数据的唯一性,例如用户 ID。
开始时间 (start_dt)): 该条记录开始生效的时间。
结束时间 (end_dt): 该条记录失效的时间。通常我们会设置一个很大的日期作为默认值,表示记录目前仍然有效。
其他业务字段: 例如用户的昵称、等级等等。
示例
假设我们有一个用户表 users: 需要记录用户等级的变化历史,以便进行用户分析和运营策略制定。
好的!咱们来用一个更具体的例子,结合代码,详细讲解拉链表的设计和使用。😉
场景: 假设我们在运营一个电商平台,需要记录用户等级的变化历史,以便进行用户分析和运营策略制定。
1. 表结构设计
我们创建一个名为 user_level_history
的拉链表,字段如下:
字段说明:
id
:自增主键,保证每条记录的唯一性。user_id
:用户ID,与用户表关联。level
:用户等级。start_dt
:等级生效时间。end_dt
:等级失效时间,默认为一个很大的日期,表示记录当前有效。is_deleted
:是否删除标记,用于软删除。索引说明:
user_id
, start_dt
, end_dt
等字段创建索引可以提高查询效率,特别是当数据量较大时。注意事项:
2. 数据初始化
假设在 2023-10-28 这天,我们平台上有两个用户:
那么 user_level_history
表的初始数据为:
初始sql为:
3. 模拟用户等级变化
4. 更新拉链表
我们需要分两步更新 user_level_history
表:
end_dt
为等级变化日期。代码示例 (以PostgreSql为例):
5. 最终数据
经过以上操作,user_level_history
表最终数据如下:
6. 查询历史数据
现在,我们可以方便地查询用户在任意时间段内的等级信息。例如,要查询用户在 2023-10-29 当天的等级:
7. 回滚拉链表
我们假设需要将 user_level_history 表的数据回滚到 2023-10-29 这天结束时的状态。
步骤一: 恢复在目标日期之后被修改或删除的数据
这句 SQL 会将 end_dt
大于 2023-10-29
且 start_dt
小于等于 2023-10-29
的记录的 end_dt
更新为默认值,相当于恢复了这些在目标日期之后被修改或删除的数据。
步骤二: 处理在目标日期之后新删除:
注意事项:
8. 归档拉链表历史数据
1.创建归档表:
创建一个结构与原拉链表相同的归档表,例如 user_level_history_archive
。
2.将历史数据插入归档表:
选择需要归档的数据,例如超过一定时间的数据,并将其插入归档表。
3.从原表删除已归档数据:
大数据量情况下hive构建拉链表
1. 建表语句
hive构建拉链表需要选取好分区字段,分区字段推荐使用end_month字段
2.查询当前有效数据
3.查询历史数据
查询10月25日当天有效数据
4.拉链表快速新增增量数据
根据增量数据判断出变动的和新增的数据,对于新增的数据直接放到999912分区即可,对于变动的数据,需要从999912分区删除,并新增到当前月的分区
假设这2条修改的数据已经在某个临时表user_level_history_incre,现在需要将user_level_history_incre的数据写入到user_level_history表里。
由于hive对修改不是很友好,对于当月分区的数据只涉及新增,对于999912分区涉及删除和新增,因此我们采取如下办法
1.找出最新的数据和当前增量的数据的差异,对于修改的数据需要更改原有的end_dt为当前时间
2.删除999912分区下的数据
3.将临时表的数据写入原表中
4.删除临时表