我必须将文章等数据存储到mysql数据库中,如果修改了文章,我还必须保存旧版本,以便恢复它。我在这个主题上找到了一些类似的问题和帖子,但我不确定,哪种解决方案最能解决问题。
以下是更好理解的基本表格“文章”:
文章(身份证,姓名,文字)
对我来说,有两种不同的方法:
将文章的数据和每个版本存储在“文章”表中,并添加“版本”和“状态”列。在版本i中存储文章的递增版本号。活动文章获得“状态”1,其他文章获得“状态”2。
Pro的:
只需要一张表
新版本是新数据的插入,只是旧状态的“状态”列的更新
精读的
将字段“version”添加到“articles”并仅将活动数据存储到表“articles”中。旧版本的数据被存储/移动到新表“articles_versioned”。
Pro的:
精读的
因此。我忘记了一个好的方法吗?如何处理其他表格中的相关数据(如图像等)?
答案 0 :(得分:7)
我的选择是方法2的变体。粗体表示主键中的字段。
articles_versioned
中插入每篇文章( ID ,时间戳,名称,文字)articles
( ID ,时间戳,[名称,文字])。注意时间戳不是主要的;可以复制名称和文本,也可以使用articles_versioned
的联接(由于id和时间戳是articles_versioned
主键,因此会很快)articles_versioned
在insert上有一个触发器,它接受刚刚插入的行并在articles
articles
表。这种方法的优点是:
articles_versioned
中插入并从articles
读取,db就会在您通过触发器插入数据时进行迁移,从而避免出现任何一致性问题。精读的
INSERT
语句中指定时间戳,而是将datetime字段设置为将当前时间作为默认值,则可以完全避免此问题。回答你的其余问题。只要在状态上添加索引,方法1就不会导致更长的查询。只有当你每篇文章都有不同的版本时才有意义;只要你平均每篇文章有2个版本或更少,索引只会降低你的速度,而且方法2无论如何都不会明显更快(尽管我仍然推荐我的方法,因为它简单地代码,因为恢复版本确实如此不需要两行的切换状态。)
相关资源(如图像)应遵循类似的版本控制。我假设你将它们保存在文件系统上;而不是使用真实姓名保存它们,使用表格( id ,image_name)为每个图像提供一个ID,然后将图像保存为-id-.jpg
。 image_name字段将使您能够知道原始文件名是什么(如果您关心它)。通过这种方式,您可以使用与版本文章相同的方式对图像进行版本设置,在文章中使用<img src="-id-.jpg">
之类的文章,您知道它们将永远可用。