正如标题所述,我的问题是数据库是否可以对Git之类的内容进行版本控制?对于我的业务,我的用例是我们每个月上线2-3次,每个都有特定的发布名称(分支)。
无论MongoDB还是Mysql等,我都愿意使用DB。 而奖金将是比较内容和/或还原到同一分支上的旧版本。 稍后将在Node.js中编程
编辑:使其更加清晰。我想要一个行版本的Controll。不是shema
答案 0 :(得分:0)
这主要基于How to version control a record in a database和http://www.sqlitetutorial.net/sqlite-trigger/:
您将需要找到有关版本和更新时间的业务规则。例如,如果客户更改了她的地址,则您要更新/更改哪些订单。当然,当这些订单已经完成并在一年前付款时,您不希望使用新地址更新订单。但是您当然希望在尚未发货的订单中更新地址。但是对于已发货但尚未到达的订单,更改送货地址会给所有相关方造成很多混乱。
此外,出于审计目的,您可能希望跟踪对某些数据字段的所有更改。但是出于其他监管原因(例如GDPR),您可能希望确定此类更改到期的日期。
因此,在决定使用哪种版本控制方案之前,请考虑如何稍后在查询中使用版本控制。
最容易适用于现有模式的方法是为每个表mytable
拥有第二个表mytable_log
,该表通过数据库触发器填充并存储旧行和新行,以及(数据库)用户和操作。这样,您的应用程序对数据库所做的任何操作都会自动记录在日志中,而不会对现有查询产生太大影响。您将需要找到一种方法,通过其数据库登录或其他变量或存储过程,将代理用户与数据库进行通信。
另一种方法是取消合并/当前表,并将历史记录和当前状态保留在同一表中,并具有反映世界当前状态的视图。这意味着您可以完全取消数据库触发器,也可以为用户撤消对表的所有删除/更新权限。缺点是您将使程序逻辑选择每个客户(或其他任何客户)的最新版本,这可以通过窗口函数来完成,但是比周围有一个合并的表要慢。同样,在这种情况下,在实际从数据库中删除一行时(例如,出于GDPR的原因),您需要注意。即使某行已使用了10年以上,它也可能是最新的,因为该行没有更新的版本。