我正在研究实现对象版本化,需要同时拥有活动对象和草稿对象,并且可以利用某人在这方面的经验,因为我开始怀疑是否有可能在没有潜在可怕的黑客攻击的情况下实现对象版本化.
出于示例的目的,我将其细分为带有标记的帖子,但我的用例稍微一般一些(涉及缓慢变化的维度-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)
)
我需要几件事:
- 能够准确地显示帖子在任意日期时间的外观,包括删除的行.
- 跟踪谁在编辑什么,以获得完整的审计跟踪.
- 为了保持引用完整性(即日志(log)记录对开发人员应该是透明的),需要一组materialized 视图("活动"表).
- 对于最新的草稿行,需要适当快速.
- 能够让征稿帖子与现场帖子共存.
我一直在调查各种 Select .到目前为止,我想到的最好的(没有点#4/#5)看起来有点像SCD type6混合设置,但不是当前的布尔值,而是当前行的materialized 视图.出于所有意图和目的,它看起来是这样的:
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来维护PERIOD(CREATED_AT、DELETED_AT)上的索引.并且我使用触发器使各个表保持同步.呀.我创建了触发器,允许取消对帖子/标签的编辑,这样草稿就可以在不发布的情况下存储到转速中.效果很好.
Except当我需要担心post2tag上与草稿行相关的关系时.在这种情况下,所有的麻烦都会爆发,这向我暗示,我在设计上有一些问题.但我的 idea 快用完了...
我考虑过引入数据复制(即 for each 修订草案引入n个post2tag行).这种方法很有效,但往往比我希望的要慢得多.
我曾考虑为"最后一稿"引入草稿表,但这很快就会变得非常非常难看.
我考虑过各种旗帜.
所以问题是:在行版本控制的环境中,是否有一种普遍接受的方法来管理活动行和非活动行?如果没有,你在哪些方面做过try 并取得了合理的成功?