我正在研究实现对象版本化,需要同时拥有活动对象和草稿对象,并且可以利用某人在这方面的经验,因为我开始怀疑是否有可能在没有潜在可怕的黑客攻击的情况下实现对象版本化.

出于示例的目的,我将其细分为带有标记的帖子,但我的用例稍微一般一些(涉及缓慢变化的维度-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)
)

我需要几件事:

  1. 能够准确地显示帖子在任意日期时间的外观,包括删除的行.
  2. 跟踪谁在编辑什么,以获得完整的审计跟踪.
  3. 为了保持引用完整性(即日志(log)记录对开发人员应该是透明的),需要一组materialized 视图("活动"表).
  4. 对于最新的草稿行,需要适当快速.
  5. 能够让征稿帖子与现场帖子共存.

我一直在调查各种 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 并取得了合理的成功?

推荐答案

我想我成功了.基本上,在相关表格中添加一个(唯一的)草稿字段,然后处理草稿,就好像它们是一个新的帖子/标签/等等:

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)
)

Database相关问答推荐

为多个列 Select 最新的非空值

KUST查询指定时间跨度内里程表&值的差值,并将其滚动到0

mongodb聚合从另一个查询中获取值

MySQL FIND_IN_SET 的对面

如何在 Angular 中使用 IndexedDB?

如何以编程方式在 C# 中创建 Microsoft Access 数据库?

MySQL 语法 LIMIT x, y 的 T-SQL 类似的功能是什么?

多列上的全文索引如何工作?

SQL Server 中的Is Identity列属性是什么意思?

The method setListAdapter(ArrayAdapter) is undefined for the type create

显示包含特定表的所有数据库名称

没有自动增量的sqlalchemy主键

Oracle:如何在 Oracle SQL 中将十六进制转换为十进制?

如何从数据库中解析时间

在 PostgreSQL 中索引空值

对于 N:M 关系,在 MongoDB 中推荐的级联删除等效项是什么?

SQL Server Express LocalDB 可以远程连接吗?

遍历数据库中的每条记录 - Ruby on Rails / ActiveRecord

最佳事件采购数据库策略

SqlParameterCollection only accepts non-null SqlParameter type objects, not String objects