ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql数据版本控制系统的最佳实践

2019-09-30 21:23:11  阅读:265  来源: 互联网

标签:mysql versioning database


我必须将类似文章的数据存储到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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有