时态数据库设计,稍有不同(实时行与草稿行)

Den*_*rdy 5 database-design

不知道我是否应该/如何交叉发布这个......但万一有些人跟随 DBA 但不是这样......

在行版本控制的环境中,是否有一种普遍接受的方法来管理实时行与非实时行?如果没有,您尝试过哪些并取得了相当成功的方法?

(有关SO 线程的完整详细信息)。


我正在考虑实现对象版本控制,并增加需要同时拥有实时对象和草稿对象的方法,并且可以使用来自某人在这方面的经验的见解,因为我开始怀疑这是否可能没有潜在的可怕黑客攻击。

为了示例,我会将其分解为带有标签的帖子,但我的用例更一般(涉及缓慢变化的维度 - http://en.wikipedia.org/wiki/Slowly_changed_dimension)。

假设您有一个帖子表、一个标签表和一个 post2tag 表:

posts (
 id
)

tags (
 id
)

post2tag (
 post_id fkey posts(id),
 tag_id fkey tags(id)
)
Run Code Online (Sandbox Code Playgroud)

我需要几件事:

  1. 能够准确显示帖子在任意日期时间的样子,包括删除的行。
  2. 跟踪谁在编辑什么,以获得完整的审计跟踪。
  3. 为了保持参照完整性(即日志记录应该对开发人员透明),需要一组物化视图(“实时”表)。
  4. 对于实时最新的草稿行,需要适当快。
  5. 能够让草稿帖子与实时帖子共存。

我一直在研究各种选择。到目前为止,我想出的最好的(没有点 #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)
)
Run Code Online (Sandbox Code Playgroud)

我正在使用 pg_temporal 来维护周期(created_at,deleted_at)上的索引。我使用触发器使各种表保持同步。Yada yada yada... 我创建了触发器,允许取消对帖子/标签的编辑,这样草稿就可以存储到 rev 中而不被发布。它工作得很好。

除非我需要担心 post2tag 上的草稿行相关关系。在那种情况下,一切都变得混乱了,这向我暗示我在那里遇到了某种设计问题。但我的想法快用完了......

我考虑过引入数据重复(即为每个修订草案引入 n 个 post2tag 行)。这种工作,但往往比我希望的要慢得多。

我考虑过为“最后一次草稿”引入草稿表,但这很快就会变得非常难看。

我已经考虑过各种标志......

所以问题是:在行版本控制的环境中,是否有一种普遍接受的方法来管理实时行与非实时行?如果没有,您尝试过哪些并取得了相当成功的方法?

Den*_*rdy 1

也交叉发布答案:


我想我成功了。基本上,您向相关表格添加一个(唯一的)草稿字段,然后您可以像处理新帖子/标签/等一样处理草稿:

posts (
 id pkey,
 public,
 created_at stamptz,
 updated_at stamptz,
 updated_by int,
 draft int fkey posts (id) unique
)

post_revs (
 id,
 public,
 created_at,
 created_by,
 deleted_at,
 pkey (id, created_at)
)

tags (
 id pkey,
 public,
 created_at,
 updated_at,
 updated_by,
 draft fkey tags (id) unique
)


tag_revs (
 id,
 public,
 created_at,
 created_by,
 deleted_at,
 pkey (id, created_at)
)

post2tag (
 post_id fkey posts(id),
 tag_id fkey tags(id),
 public,
 created_at,
 updated_at,
 updated_by,
 pkey (post_id, tag_id)
)

post2tag_revs (
 post_id,
 tag_id,
 public,
 created_at,
 created_by,
 deleted_at,
 pkey (post_id, tag_id, created_at)
)
Run Code Online (Sandbox Code Playgroud)