【问题标题】:How to properly manage versions of a row in a database?如何正确管理数据库中行的版本?
【发布时间】:2014-07-19 22:08:43
【问题描述】:

我正在开发一个网络应用程序,我有一个名为“Article”的表格和另一个名为“Section”的表格。 一篇文章由部分组成。我想为我的网络应用程序中所做的每次编辑保存每个文章版本。

例如,当我编辑一篇文章 X 时,我想将其版本从 1.1 增加到 2,并保留旧版本的内容以供审核。

我建议引入一个名为“Article_Versions”的新表,该表与文章表具有多对一关系。所以每篇文章在另一个表中必须有多个版本,但我想知道这是否不会影响性能,尤其是我必须为部分版本引入更多表等等......

我的问题是:有没有“完美”的做法来解决这类问题?

【问题讨论】:

  • 查看 Hibernate Envers
  • 这正是我需要的 :) 谢谢@NeilMcGuigan

标签: mysql jakarta-ee database-design versioning


【解决方案1】:

很少有完美的。性能是使用模式下时间和空间的权衡。设计是性能与使用和实现复杂性的权衡。

存在,用于记录应用程序关系,例如:

VAT(V,A,T) -- version V of artcle A has text T

当你需要时,你可以把它分开:

current_VAT(V,A,T) the most recent version of Article A is V and has text T
old_VAT(V,A,T) -- version V of article A has text T AND V is not the most recent version of
-- VAT = currrent_VAT UNION old_VAT
-- is_empty(current_VAT EXCEPT old_VAT)
-- FORALL A,cV,cT,cV,cT [current_VAT(cV,A,cT) AND old_VAT(oV,A,oT) IMPLIES cV > oV]

这使得一些查询更快,一些更慢。作为基本事实的呈现,它更加复杂。对于某些用途,它也更复杂,但其他用途则不然。

我不清楚您建议使用哪组表格。是的,从文章到版本之间存在多对一的应用关系。但它可以表示为:

EXISTS T VAT(V,A,T)

因此,您仍然需要全键增值税。 (或等价物。)

【讨论】:

    猜你喜欢
    • 2014-01-17
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2021-01-06
    • 2015-05-08
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多