【问题标题】:Is it possible to version controll a database like GIT?是否可以对像 GIT 这样的数据库进行版本控制?
【发布时间】:2019-03-23 01:15:59
【问题描述】:

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

无论是 MongoDB 还是 Mysql 等,我都愿意使用 wich DB。 奖励将是比较内容和/或恢复到同一分支上的旧版本。 稍后这将在 Node.js 中编程

编辑:使其更清晰。我想要一个行版本的 Controll。不是shema

【问题讨论】:

  • 是的。看Liquibase
  • 请稍微扩展一下您想要版本控制的内容。如果您想要行级版本控制,您可以通过将触发器插入到日志中轻松地做到这一点,或者通过执行现在所谓的“事件溯源”,您只有日志表。如果你想在不同的模式版本之间切换,你需要认真考虑数据应该发生什么。您将需要双向迁移,这很难做到。
  • @Corion 我想要行级版本 Controll。抱歉,如果不清楚。我是数据库版本控制的新手

标签: mysql sql database mongodb version-control


【解决方案1】:

这主要基于How to version control a record in a databasehttp://www.sqlitetutorial.net/sqlite-trigger/

您需要找到有关版本和何时更新的业务规则。例如,如果客户更改了她的地址,您想要更新/更改哪些订单。当然,当这些订单已经在一年前完成并付款时,您不希望使用新地址更新订单。但是您当然希望更新尚未发货的订单中的地址。但是对于已经发货但尚未到达的订单,更改收货地址会给所有相关方造成很多混乱。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 2018-10-02
    • 2013-10-23
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多