如何在应用程序/数据库中保留未提交的数据直到它被提交

Posted

技术标签:

【中文标题】如何在应用程序/数据库中保留未提交的数据直到它被提交【英文标题】:How to keep uncomitted data in the application/database till it gets comitted 【发布时间】:2021-12-05 10:23:47 【问题描述】:

我有一个场景,cms 用户通过应用程序/CMS 对数据进行的任何更新/更改都需要管理员/授权用户的批准。单个文档/记录中的一次更新可能有多个更改。此批准不会实时完成,可能需要几个小时或几天。授权人也可以拒绝更改。因此,在这种情况下,在批准或拒绝之前不将其提交到数据库的情况下,保持这些数据有效的最佳方法是什么。我应该创建临时表还是重复表以将这些数据临时保存在数据库中?但这会导致大量临时表(每个表一个)。或者在开发人员/应用程序/java端还有其他选择吗?我在这里使用 Oracle 和 Java。

【问题讨论】:

您需要提交草稿/未批准的版本。数据库或应用程序崩溃的原因有很多,您真的不希望用户丢失他们的工作。我对您的工作流程了解不多,无法给出明确的答案,但您可能需要一个处理文档版本的数据结构,以批准状态区分。这可能涉及到多个表,这取决于许多考虑因素。 您需要区分功能流(待批准、已批准等)和数据库完整性。你必须始终承诺。有不同的技术,每个阶段都有不同的表,在同一个表中使用标志来检查任何记录的演变。您也可以使用 SCD 逻辑。 【参考方案1】:

您需要更好地理解问题。 您不需要一个数据存储, 您需要两个数据存储。

数据存储区一(可能是表一)将包含未经批准的更改。 这是“建议”状态。 一旦用户请求更改,您将立即将所有数据写入并提交到此数据存储中。

数据存储二(可能是表二)将包含已批准的更改; 这是“真实”的状态。 一旦数据存储区中的更改经过审核和批准, 您必须在此处应用更改。

另一个可能的解决方案是使用 Kafka 主题:

    使用 Kafka 主题存储未批准的更改。 将主题提供给审阅者。 批准后,记下决定(在同一主题中)并将更改写入数据库。

注意: 数据存储 1 和数据存储 2 可以是同一张表, 只需有一列表示“已批准的更改”, “拒绝改变”, 和“待更改”。

【讨论】:

拥有单独的数据存储是一个设计决定,这里没有“需要”。为最终版本指定一个表可能会带来一些好处,但会增加应用程序的复杂性和维护成本。 我同意@APC。正如问题所描述的那样,“教科书”解决方案将是拥有一个数据存储,并且只需有一个列来指示工作流中记录的状态 我同意 APC 和 EdStevens 的观点。此外,使用 Kafka 从来都不是 OP 的一部分。【参考方案2】:

您始终可以拥有数据的草稿和最终副本。草稿副本将以草稿模式保存您的工作,提交和从应用程序保存/确认等操作可以将其复制到最终版本。

这需要另外一条记录来识别草稿/最终版本,并且您应该使用草稿数据在 UI 上显示。

【讨论】:

以上是关于如何在应用程序/数据库中保留未提交的数据直到它被提交的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 如何实现自动提交或保留用户未登录前得信息

如何在 cookie 上保留 ASP.NET 身份声明直到注销?

我的进程中所有这些未提交的保留内存是啥?

保留文本框的先前值,直到表单关闭

在Django中,提交表单2后如何保留表单数据?

在js中如何实现提交表单页面保留原来的值