2009-08-13 94 views
4

我有一个数据库与书籍。版本跟踪与mysql

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

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

还有其他方法吗?

是否有数据库系统(我只使用过mysql)谁可以自动跟踪更改?

问候......

回答

1

您可以使用触发器(如MySQL有他们,我认为它)赶上“更新”事件,并输入一堆相关的信息变成了“登录”表。

数据库确实有事务日志,但可能对您没有用处,因为我不认为它可以进行简单的查询。

1

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

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

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

+0

它的一个变体是两列:'active-from'和'active-to',这将允许你排队未来的产品/ offer/etc。 – 2009-08-13 12:45:51

4

一种方法是有2个单独的表格,例如booksbook_versions具有相同的一组字段(作者,出版者,描述等)。

只要您的应用程序插入或更新到books中,您就在book_versions中插入相应的记录。这意味着books表包含记录的最新版本,并且book_versions包含最新和所有历史版本。如果您只对最新版本感兴趣,大多数情况下您只能通过ID从书籍中选择,并且只在需要时才检索历史记录。这是用于Ruby on Rails的acts_as_versioned插件所使用的方法。

1

我建议将更新日志表添加到您的系统中。这个表只能写入,并且它有列日期,主题,谓词,对象,其中主题是作者/主体进行更改,谓词是更改的本质(创建,更新,删除),对象是事情正在改变。可能的是,您仍然可以将对象仍然分为ID,属性和值,其中ID是书籍ID,属性是要更改的属性的字符串名称,值为旧值(因为新值位于适当的表格中)。

1

上述任何建议的解决方案都可以使用;这实际上取决于您的工作负载和数据集大小。

如果您有很多记录,并且您只想要历史归档以供参考,那么您也可以考虑将“旧/早”版本从数据库中移出,并以某种链接列表格式(例如,插入一个包含以前版本地址的版本,从而形成一个链表),并在DB中保留一个指向最新版本的指针。

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