mysql - 是否可以像 GIT 这样对数据库进行版本控制?

标签 mysql sql database mongodb version-control

正如标题所说,我的问题是数据库是否可以像 Git 一样对内容进行版本控制?我的用例是我们的业务,我们每月上线 2-3 次,都有特定的版本名称(分支)。

我对使用哪个数据库持开放态度,无论是 MongoDB 还是 MySQL 等。 一个额外的好处是比较内容和/或恢复到同一分支上的旧版本。 稍后将在 Node.js 中进行编程

编辑:使其更清楚。我想要一个行版本控制。不是架构

最佳答案

这很大程度上基于How to version control a record in a databasehttp://www.sqlitetutorial.net/sqlite-trigger/ :

您需要找到关于要版本化什么以及何时更新什么的业务规则。例如,如果客户更改了地址,您要更新/更改哪些订单。当然,当这些订单一年前已经履行并付款时,您不希望使用新地址更新订单。但您当然希望更新尚未发货的订单中的地址。但对于已经发货但尚未到达的订单,更改送货地址会给相关各方带来很多困惑。

此外,出于审核目的,您可能希望跟踪某些数据字段的所有更改。但出于 GDPR 等其他监管原因,您可能希望确定此类更改的到期日期。

因此,在决定使用哪种版本控制方案之前,请考虑稍后在查询中如何使用版本控制。

最容易附加到现有模式的方法是为每个表 mytable 提供第二个表 mytable_log,该表通过数据库触发器填充并存储旧的表行和新行以及(数据库)用户和操作。这样,应用程序对数据库执行的任何操作都会自动记录在日志中,而不会对现有查询产生太大影响。您需要找到一种方法将执行用户与数据库进行通信,可以通过数据库登录,也可以通过附加变量或存储过程。

另一种方法是取消合并/当前表,并将历史记录和当前状态保留在同一个表中,并具有反射(reflect)世界当前状态的 View 。这意味着您可以完全取消数据库触发器,并撤销用户对表的所有删除/更新权限。缺点是您将让程序逻辑选择每个客户的最新版本(或其他),这可以通过窗口函数完成,但会比使用合并表慢。此外,在这种情况下,您在实际从数据库中删除行时需要小心(例如,出于 GDPR 原因)。即使某行已存在超过 10 年,它也可能仍然是最新的,因为没有可用的更新版本。

关于mysql - 是否可以像 GIT 这样对数据库进行版本控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52870461/

相关文章:

php - 巴士票务预订系统

mysql - 如何从MySQL数据库中选择最新日期

java - 用Java动态组装SQL查询

java - 在 java 中设置参数时,Prepared Statement 查询构建不起作用

mysql - SQL 数据库电影票

java - 以原子方式更新多行

mysql - 改进 MySQL 查询

java - 如何在 jpa 和 jpql 中联接多个表列

MYSQL 整理性能

mysql - 如何收集图表数据