不确定我是否/如何交叉发布这个……但如果有人关注 DBA 而不是 SO……
在行版本控制的环境中,是否有一种普遍接受的方法来管理活动行与非活动行?如果没有,您尝试过什么并取得了相当大的成功?
(有关SO 线程的完整详细信息)。
我正在研究实现对象版本控制,同时需要同时拥有活动对象和草稿对象,并且可以利用某人在这方面的经验的见解,因为我开始怀疑它是否有可能没有潜在的可怕黑客攻击。
为了示例,我将其分解为带有标签的帖子,但我的用例更一般(涉及缓慢变化的维度 - http://en.wikipedia.org/wiki/Slowly_changing_dimension)。
假设您有一个 posts 表、一个 tags 表和一个 post2tag 表:
posts (
id
)
tags (
id
)
post2tag (
post_id fkey posts(id),
tag_id fkey tags(id)
)
我需要一些东西:
- 能够准确显示帖子在任意日期时间的样子,包括已删除的行。
- 跟踪谁在编辑什么,以获得完整的审计跟踪。
- 需要一组物化视图(“实时”表)以保持参照完整性(即日志记录对开发人员应该是透明的)。
- 对于实时和最新的草稿行,需要适当地快。
- 能够让草稿帖子与实时帖子共存。
我一直在研究各种选择。到目前为止,我想出的最好的(没有点#4/#5)看起来有点像 SCD type6-hybrid 设置,但是没有当前布尔值,而是当前行的物化视图。出于所有意图和目的,它看起来像这样:
posts (
id pkey,
public,
created_at,
updated_at,
updated_by
)
post_revs (
id,
rev pkey,
public,
created_at,
created_by,
deleted_at
)
tags (
id pkey,
public,
created_at,
updated_at,
updated_by
)
tag_revs (
id,
public,
rev pkey,
created_at,
created_by,
deleted_at
)
post2tag (
post_id fkey posts(id),
tag_id fkey tags(id),
public,
created_at,
updated_at,
updated_by
)
post2tag_revs (
post_id,
tag_id,
post_rev fkey post_revs(rev), -- the rev when the relation started
tag_rev fkey tag_revs(rev), -- the rev when the relation started
public,
created_at,
created_by,
deleted_at,
pkey (post_rev, tag_rev)
)
我正在使用 pg_temporal 维护周期索引(created_at,deleted_at)。我使用触发器使各种表保持同步。Yada yada yada ...我创建了触发器,允许取消对帖子/标签的编辑,这样草稿就可以存储在 revs 中而不被发布。它很好用。
除非我需要担心 post2tag 上的草稿行相关关系。在那种情况下,一切都乱套了,这暗示我那里有某种设计问题。但我的想法已经用完了......
我考虑过引入数据重复(即为每个修订草案引入 n 个 post2tag 行)。这种工作方式,但往往比我希望的要慢得多。
我考虑过为“最后的草稿”引入草稿表,但这很快就会变得非常难看。
我考虑过各种旗帜......
所以问题:在行版本控制的环境中,是否有一种普遍接受的方法来管理活动行与非活动行?如果没有,您尝试过什么并取得了相当大的成功?
也交叉发布答案:
我想我成功了。基本上,您向相关表格添加一个(唯一的)草稿字段,然后处理草稿,就好像它们是新帖子/标签/等一样: