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