【发布时间】:2016-12-07 01:03:57
【问题描述】:
我正在通过 post 对表进行记录级版本控制。我注意到该架构处理历史表的使用。但是,我的场景不需要回滚,而是检索时间点记录。这是我尝试使用单个表进行版本控制的设计。请注意,这是一个裸骨表数据(没有约束、索引等)。我打算根据 id 进行索引,因为这涉及列上的 group by 子句。
例如,我有一个表测试,其中
id 是标识符,
modstamp 是数据的时间戳(从不为空)
除了上面的列之外,该表还将包含簿记列
local_modstamp 是更新记录的时间戳
del_modstamp 是删除记录的时间戳
在备份期间,所有记录都从源获取并插入到记录将具有值 local_modstamp = null 和 del_stamp = null 的位置。
id |modstamp |local_modstamp |del_modstamp |
---|---------------------------|---------------|-------------|
1 |2016-08-01 15:35:32 +00:00 | | |
2 |2016-07-29 13:39:45 +00:00 | | |
3 |2016-07-21 10:15:09 +00:00 | | |
一旦获得记录,这些是处理数据的场景(假设参考时间[ref_time]是流程运行的时间):
正常插入。
更新:使用 local_modstamp = ref_time 更新最新记录。然后插入新记录。 查询将是: 更新测试集 local_modstamp = where id = and local_modstamp is not null and del_modstamp is not null 插入测试值(...)
删除:使用 del_modstamp = ref_time 更新最新记录。 更新测试集 del_modstamp = where id = and local_modstamp is not null and del_modstamp is not null
设计目的是获取local_modstamp不为空且del_modstamp不为空的最新记录。 但是,我遇到了一个问题,我打算使用查询(最内层查询)检索时间点:
select id, max(modstamp) from test where modstamp <= <ref_time> and (del_modstamp is null || del_modstamp <= <ref_time>) group by id;
似乎我犯了一个错误(有吗?)使用 null 作为占位符来标识表的最新记录。有没有办法使用现有的设计来获取时间点记录?
如果不是,我想可能的解决方案是将 local_modstamp 设置为最新记录。这需要在更新时使用 max(local_modstamp) 更新逻辑。我可以坚持现有的架构来实现检索时间点数据吗?
我现在正在使用 SQL-Server,但这种设计也可以扩展到其他数据库产品。我打算使用更通用的方法来检索数据,而不是使用特定于供应商的hacks。
【问题讨论】:
标签: database-design database-versioning