我一直在考虑在数据库中保存“实时”数据集和草稿数据集的最佳方法。实时版本显示在网站上,草稿版本一直处于工作状态,直到它准备好上线为止。该模型是关系型的,由许多表组成。
我目前的方法是拥有2个数据库,一个用于草稿,一个用于实时。 当您将数据提升为活动时,SQL只会将草稿数据库中的数据复制到实时数据库。
这很好,但有点慢,看起来很乱。经常SQL必须考虑两组表。
另一种方法是将Live指标作为每个表的键的一部分,因此我可以在同一个表中保存实时和草稿 - 并更新指标以使数据生效。 - 我并没有真正卖掉这个想法。
如果有人有任何其他建议,我将不胜感激。
微摩尔。
答案 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个并行表格。