实时和草稿数据的数据库模型

时间:2009-06-03 20:33:26

标签: database-design

我一直在考虑在数据库中保存“实时”数据集和草稿数据集的最佳方法。实时版本显示在网站上,草稿版本一直处于工作状态,直到它准备好上线为止。该模型是关系型的,由许多表组成。

我目前的方法是拥有2个数据库,一个用于草稿,一个用于实时。 当您将数据提升为活动时,SQL只会将草稿数据库中的数据复制到实时数据库。

这很好,但有点慢,看起来很乱。经常SQL必须考虑两组表。

另一种方法是将Live指标作为每个表的键的一部分,因此我可以在同一个表中保存实时和草稿 - 并更新指标以使数据生效。 - 我并没有真正卖掉这个想法。

  • DBMS是Sybase。

如果有人有任何其他建议,我将不胜感激。

微摩尔。

4 个答案:

答案 0 :(得分:2)

有一张表

DataTable
    DataKey
    DataMode
    Data...

PK是DataKey + DataMode
检查约束:DataMode IN('L','D') - 生活或草稿

首先使用DataMode ='D'插入--draft
当它上线时,用INSERT SELECT将它复制到同一个表中,设置DataMode ='L'
总是编辑DataMode ='D',并在完成后将其推送到DataMode ='L'。

如果要在模式中显示数据传递,请使用WHERE DataKey = @ x AND DataMode = @ Mode

我不确定你将如何处理删除(删除草稿然后将其删除?)你可能想要添加状态列:

    DataStatus  --'A'ctive 'D'eleted

在一个表中执行此操作允许所有sql的常用用于“L”ive或“D”raft。

答案 1 :(得分:1)

两种想法,视情况而定。

如果草稿版本卷入时某些数据仍然是最新的,并且您只想让新数据同时生效,则可以为每个数据元素提供版本号,并为当前活动版本号提供配置选项。然后编写逻辑,以便所选记录具有版本号< =当前版本号(忽略更高版本号)。这可能是低中断,也许可以通过需要两个版本来处理你的意思。

如果要交换整个表,并且可以(非常)短暂地断开连接,请重命名表。可能比您描述的选项破坏性更小,也可以允许同时访问。

答案 2 :(得分:0)

我认为这是有效约会的主要候选人。为每个表添加开始和结束日期。如果当前日期在开始日期和结束日期之间,或者在开始日期和结束之后为NULL,则记录为活动日期。其他任何内容都不会显示为实时,您可以使用草稿数据。

如果数据是连续的并且要保留先前值的历史记录,则这将允许多组草稿数据。或者,如果数据卷存在问题,请使用在低DB工作负载时运行的作业,以删除enddate小于当前日期的任何记录。

答案 3 :(得分:0)

创建您正在使用的密钥,以及默认为N的布尔is_live列。当您要发布时,只需将该列更新为Y.

完成这项工作将迫使您查看所有查询,以便在不应该看到它们时过滤掉草稿,但是可以节省您必须维护具有相同格式的所有2个并行表格。