为了这个例子,我会将其分解为带标签的帖子,但是我的用例更为普遍(涉及缓慢变化的维度 – http://en.wikipedia.org/wiki/Slowly_changing_dimension).
假设你有一个帖子表,一个标签表和一个post2tag表:
posts ( id ) tags ( id ) post2tag ( post_id fkey posts(id),tag_id fkey tags(id) )
我需要几件事情:
>能够精确地显示一个帖子如何在任意的日期时间,包括删除的行.
跟踪谁正在编辑什么,完整的审计跟踪.
>为了保持参照完整性(即记录应该对开发者透明),需要一组物化视图(“活”表).
>需要适当的快速生活和最新的草案行.
能够让一个草稿与一个现场的帖子共存.
我一直在调查各种选择.到目前为止,我所想出的最好的(没有点#4 /#5)看起来有点像SCD type6混合设置,但是没有当前的布尔值,所以当前行有一个物化视图.对于所有意图和目的,它看起来像这样:
posts ( id pkey,public,created_at,updated_at,updated_by ) post_revs ( id,rev pkey,created_by,deleted_at ) tags ( id pkey,updated_by ) tag_revs ( id,deleted_at ) post2tag ( post_id fkey posts(id),tag_id fkey tags(id),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,deleted_at,pkey (post_rev,tag_rev) )
我使用pg_temporal来维护期间的index(created_at,deleted_at).我使用触发器保持不同的表同步. Yada yada yada …我创建了触发器,允许取消对帖子/标签的编辑,使得草稿不会被发布而存储在转录中.它的作品很棒
除了当我需要担心post2tag上的排行相关关系时.在这种情况下,所有的地狱都会松动,这暗示着我,在那里我有一些设计问题.但我没有想法…
我考虑引入数据重复(即为每个草案修订引入n个post2tag行).这种作品,但往往比我想要的慢很多.
我考虑过“最后草案”的草案表,但这很快就会变得非常丑陋.
我考虑过各种各样的旗帜
所以问题:在行版本控制的环境中是否有一种普遍接受的方式来管理实时和非实时行?如果没有,你有什么尝试和合理的成功?
解决方法
有一段时间习惯,但工作不错.
有一个 online modeling tool,如果你加载提供的XML文件[File – >从本地文件加载模型]
你应该看到这样的东西 – 也可以使用[布局 – > Togle名称].
[生成 – > sql代码]将为表,视图和时间点函数生成DDL.
代码很长,所以我不会在这里发贴.检查代码 – 你可能需要修改它
为您的数据库.
这是要加载到建模工具中的文件.
<schema> <knot mnemonic="EXP" descriptor="Expired" identity="smallint" dataRange="char(1)"> <identity generator="true"/> <layout x="713.96" y="511.22" fixed="true"/> </knot> <anchor mnemonic="US" descriptor="User" identity="int"> <identity generator="true"/> <attribute mnemonic="USN" descriptor="UserName" dataRange="varchar(32)"> <layout x="923.38" y="206.54" fixed="true"/> </attribute> <layout x="891.00" y="242.00" fixed="true"/> </anchor> <anchor mnemonic="PO" descriptor="Post" identity="int"> <identity generator="true"/> <attribute mnemonic="TIT" descriptor="Title" dataRange="varchar(2)"> <layout x="828.00" y="562.00" fixed="true"/> </attribute> <layout x="855.00" y="471.00" fixed="true"/> </anchor> <anchor mnemonic="TG" descriptor="Tag" identity="int"> <identity generator="true"/> <attribute mnemonic="TGT" descriptor="TagText" dataRange="varchar(32)"> <layout x="551.26" y="331.69" fixed="true"/> </attribute> <layout x="637.29" y="263.43" fixed="true"/> </anchor> <anchor mnemonic="BO" descriptor="Body" identity="int"> <identity generator="true"/> <attribute mnemonic="BOT" descriptor="BodyText" dataRange="varchar(max)"> <layout x="1161.00" y="491.00" fixed="true"/> </attribute> <layout x="1052.00" y="465.00" fixed="true"/> </anchor> <tie timeRange="datetime"> <anchorRole role="IsTagged" type="PO" identifier="true"/> <anchorRole role="IsAttached" type="TG" identifier="true"/> <anchorRole role="BYAuthor" type="US" identifier="false"/> <knotRole role="Until" type="EXP" identifier="false"/> <layout x="722.00" y="397.00" fixed="true"/> </tie> <tie timeRange="datetime"> <anchorRole role="Contains" type="PO" identifier="true"/> <anchorRole role="ContainedIn" type="BO" identifier="false"/> <layout x="975.00" y="576.00" fixed="true"/> </tie> <tie> <anchorRole role="CreatedBy" type="TG" identifier="true"/> <anchorRole role="Author" type="US" identifier="false"/> <layout x="755.10" y="195.17" fixed="true"/> </tie> <tie> <anchorRole role="CreatedBy" type="PO" identifier="true"/> <anchorRole role="Author" type="US" identifier="false"/> <layout x="890.69" y="369.09" fixed="true"/> </tie> <tie> <anchorRole role="ModifiedBy" type="BO" identifier="true"/> <anchorRole role="Author" type="US" identifier="false"/> <layout x="1061.81" y="322.34" fixed="true"/> </tie> </schema>