什么是最好的方式来存储更改数据库logging需要批准才可见?

我需要将用户input的更改存储到特定的表中,但在pipe理用户查看和批准之前不会显示这些更改。 虽然这些更改仍处于未决状态,但我仍然会显示旧版本的数据。 存储这些等待批准的更改的最佳方式是什么?

我想到了几种方法,但是不知道什么是最好的方法。 这是一个非常小的networking应用程序。 一种方法是有一个PendingChanges表模仿其他表的模式,然后一旦更改被批准,我可以用这些信息更新真正的表。 另一种方法是做某种forms的logging版本,在表格中存储多个版本的数据,然后总是将logging标记为已批准的最高版本号。 这将限制额外表的数量(我需要为多个表执行此操作),但是每次我拔出一组logging以确保获得正确的logging时,将需要我执行额外的处理。

任何与这些方法或其他可能是好的个人经验?

更新:只是为了澄清,在这种特殊情况下,我对历史数据并不感兴趣。 我只需要一些方法来批准用户在网站上线之前所做的任何更改。 因此,用户将编辑他们的“个人资料”,然后pipe理员将查看该修改并批准。 一旦批准,这将成为显示值,旧版本不需要保存。

有人试过下面的解决scheme,在那里存储任何需要在一个特殊的PendingChanges表格中作为XML跟踪它们的表的挂起更改? 每条logging都有一个表示更改内容的列,可能存储更改logging的id列(如果是新logging则为null),更改时存储的date时间列以及一列存储更改后的logging的XML(可能可能序列化我的数据对象)。 由于我不需要历史logging,在批准更改后,真实表格将被更新,并且可以删除PendingChangelogging。

有关这种方法的任何想法?

大小是你的敌人。 如果你正在处理大量的数据和大量的行,那么把历史与现在混合在一起就会打击你。 如果您与其他数据联系并确保您的行数正确,那么您也会遇到问题。

如果您需要保存历史数据以显示随时间的变化,那么我将使用单独的历史数据表,该数据表在批准后会更新实时的真实数据。 这只是全方位的清洁工。

如果你有很多数据types会有这个机制,但不需要保留一个历史logging,我会build议一个共同的队列talbe审查未决的项目,说存储为XML。 这将允许只有一个表被pipe理员读取,并且使您能够相当容易地将此​​function添加到您的系统中的任何表。

将它们绝对存储在主表中,并用列指示数据是否被批准。

更改通过后,不需要复制。 过滤未经批准的数据的额外工作是数据库应该做的事情,当您考虑它时。 如果您对已批准的专栏进行索引,那么做正确的事情不应该太麻烦。

我在一个银行领域工作,我们有这个需求 – 一个用户所做的改变只有经过另一个用户的批准才能体现出来。 我们使用的devise如下

  1. 主表A
  2. 另一个表B存储更改的logging(因此与第一个完全相似)+ 2个附加列(一个FKey to C和一个代码,用于指示更改types)
  3. 第三个表C存储所有需要批准的logging
  4. 第四个表D存储历史(你可能不需要这个)。

我推荐这种方法。 它非常优雅地处理所有场景,包括更新和删除。

面对大多数公开交易的公司,我们已经推行了SOx合规运动,在这方面我有相当多的经验。 通常我一直在使用一个带有时间标记的单独表格,并且正在等待某种标志列的更改。 这个数据的pipe理负责人得到待处理的变更清单,可以select接受或不接受。 当一段数据被接受时,我使用触发器将新数据整合到表中。 虽然有些人不喜欢触发方法,而宁愿将其编码到存储的特效中。 即使在相当大的数据库中,这对我也很好。 复杂性可能有点难以处理,尤其是在处理一个变更直接与另一个变更冲突的情况下,以及处理这些变更的情况。持有请求数据的表永远不能被删除,因为它所谓的“面包屑”就是要求在需要追溯特定情况下发生的情况下。 但是在任何方法中,都需要评估风险,例如我提到的冲突数据,并且需要有业务逻辑层来确定这些情况下的过程。

我个人不喜欢相同的表格方法,因为在数据存储不断变化的情况下,表格中的这些额外的数据可能会不必要地使桌面上的请求停滞不前,并且需要更多的细节索引表和您的执行计划。

我会创build一个带有标志的表格并创build一个类似的视图

CREATE OR REPLACE VIEW AS SELECT * FROM my_table where approved = 1 

它可以帮助分离获取和查询之间的依赖关系。 但如果需要更新视图,可能不是最好的想法。

移动logging可能有一些性能考虑。 但分区表可以做一些非常相似的事情。

因为这是一个networking应用程序,我将假设有更多的读取比写入,并且你想要的东西相当快,你的冲突解决(即乱序批准)导致相同的行为 – 最新的更新是那用来。

你提出的两种策略都是相似的,每个变更集都保持一行,不得不处理冲突等,唯一的区别是是否将数据存储在一个或两个表中。 鉴于这种情况,出于性能原因,两个表似乎是更好的解决scheme。 如果您的数据库支持,也可以使用一个表和最近批准的更改视图解决此问题。

还有一个想法是有三张桌子。

  • 一个是保存原始数据的主表。
  • 第二个会持有build议的数据。
  • 第三个将持有历史数据。

这种方法使您能够快速轻松地回滚,并在需要时为您提供审计跟踪。

我认为第二种方法是更好的方法,只是因为它更好地扩展到多个表格。 此外,额外的处理将是最小的,因为您可以根据“已批准”位创build表的索引,您可以专门化您的查询,以拉取批准(用于查看)或未批准(批准)条目。