保存数据库字段更改 - 最佳做法?版本控制,Loggable?

时间:2012-03-23 19:14:43

标签: database symfony doctrine

我使用Symfony 2和Doctrine作为ORM Framework。我正在寻找保存对数据库字段所做更改的最佳方法。我将有大约100个表,每个表有大约50个字段和几千行。现在我想保存对字段所做的所有更改。

我想到的可能性: Doctrine扩展名“Loggable” - 将更改保存在不同的表中,但不知道它是否能够提供这么多的条目。

每个表的MySQL触发器,用于保存新表中的更改吗?

但保存更改的最佳做法是什么?

4 个答案:

答案 0 :(得分:5)

您可以使用MySQL触发器或提到的DoctrineExtension Loggable功能。这两部作品都有缺点和优点。 MySQL触发器可以写入单独的表(参见mysql trigger FAQ)。

触发器:

  • ++框架,独立于编程语言
  • ++可以在您想要手动或通过脚本修改数据时使用。
  • - 您必须为每个表编写触发器,或者必须在SQL中找出一些通用解决方案(我无法帮助)。
  • - 如果您不熟悉存储过程和PL / SQL,那么就有学习曲线

学说扩展:

  • ++只需在类上添加注释即可。
  • ++您可以查询历史记录,通过Repository API恢复更改
  • - 你自己锁定供应商,这有时是,有时不是问题
  • - 当您手动或使用第三方脚本修改数据时不起作用。

如果把学说转换成其他东西的可能性很低,我会从学说扩展开始。它毕竟是一个有助于处理SQL的确切目的的工具。

答案 1 :(得分:1)

我建议使用触发器,特别是如果您希望您的日志记录功能保持独立于应用程序 - 也就是说,即使您决定在不同的框架或完全不同的编程语言上重写您的应用程序,它也会起作用。

P.S。我不知道MySQL中的触发器支持有多棒,因为我在MySQL甚至拥有它们之前就切换到了PostgreSQL。

答案 2 :(得分:0)

这种事情通常被称为“变更数据捕获”。在SO:

之前已经被问及参考MySQL

Change Data Capture in MySQL

也许这个答案可以帮到你。

不同的供应商在不同程度上将其作为内置功能。<​​/ p>

答案 3 :(得分:0)

以下文章详细介绍了使用触发器进行版本控制的示例代码。

http://www.jasny.net/articles/versioning-mysql-data/