使用mysql进行版本跟踪

时间:2009-08-13 07:36:41

标签: mysql versioning

我有一个带书籍的数据库。

一本书有一个作者,出版商。 一些价格,ID和描述。

我想跟踪对一种产品所做的更改。一种方法是使用时间和ID作为主键保存产品。

还有其他方法吗?

是否有自动跟踪变化的数据库系统(我只使用过mysql)?

...问候

7 个答案:

答案 0 :(得分:5)

您要求的内容主要由"Change Data Capture" (CDC)设计模式和"Slowly changing dimension" (SDC)概念涵盖。

阅读维基百科关于这些主题的文章,因为它们提供了关于这一主题的良好鸟瞰图。

答案 1 :(得分:4)

一种方法是有2个单独的表,例如booksbook_versions具有相同的字段集(作者,出版商,说明等)。

每当您的应用程序插入或更新到books时,您都会在book_versions中插入相应的记录。这意味着books表包含最新版本的记录,book_versions包含最新版本和所有历史版本。如果您只对最新版本感兴趣,大部分时间您都可以通过ID从书籍中选择,并且只在您需要时检索历史记录。这是Ruby on Rails的acts_as_versioned插件使用的方法。

答案 2 :(得分:1)

您可以使用触发器(如果mysql拥有它们,我认为它会这样做)来捕获'update'事件并在'log'表中输入一堆相关信息。

数据库确实有事务日志,但可能它对你没有用,因为我认为它不能被轻易查询。

答案 3 :(得分:1)

一个简单的解决方案是在产品表中包含修改日期作为字段。

更新存储过程,以便始终使用带有最新生效日期的产品ID来提取产品。

这将允许您使用单独的存储过程列出产品的所有版本。

答案 4 :(得分:1)

我建议在系统中添加一个changelog表。这个表只写入,它有列date,subject,谓词,对象,其中subject是作者/主体进行更改,谓词是更改的本质(创建,更新,删除),对象是事情正在改变。您可以将对象仍然分为id,attribute,value,其中id是book id,attribute是要更改的属性的字符串名称,value是 old 值(作为新值)在适当的表格中。)

答案 5 :(得分:1)

上述任何建议的解决方案都有效;它实际上取决于您的工作量和数据集大小。

如果你有很多记录并且你只想要历史档案供参考,你也可以考虑从数据库中移出“旧/早期”版本,而是以某种链表格式将它们存储在磁盘上(例如插入包含先前版本地址的版本,因此形成链接列表),并在DB中保留指向最新版本的指针。

这种方法有优点和缺点,但有一个优点是你可以保持你的数据库小,只需从磁盘读取旧版本。您的旧版本应该是不可变的,因此您不需要依赖数据库的事务/并发支持。如果您的“当前/最新”数据集(例如100G)和过去的版本是900G,那么您可以将数据库放在100G上的RAID上并将过去的版本放在更便宜的存储上,并将其复制一些times(它们是原子的,因此在复制时不会出现并发问题)。

答案 6 :(得分:1)

您可能对temporal databases用于描述时间变化的概念感兴趣。时间数据库上有a freely available book可以在每个细节中描述这个概念,但对于更为实际的内容,您可以阅读我最喜欢的编程作者Martin Fowler的Patterns for things that change with time