我有一个数据库与书籍。版本跟踪与mysql
一本书有一个作者,出版商。 一些价格,ID和说明。
我想跟踪对某个产品所做的更改。一种方法是用时间和ID保存产品作为主键。
还有其他方法吗?
是否有数据库系统(我只使用过mysql)谁可以自动跟踪更改?
问候......
我有一个数据库与书籍。版本跟踪与mysql
一本书有一个作者,出版商。 一些价格,ID和说明。
我想跟踪对某个产品所做的更改。一种方法是用时间和ID保存产品作为主键。
还有其他方法吗?
是否有数据库系统(我只使用过mysql)谁可以自动跟踪更改?
问候......
您可以使用触发器(如MySQL有他们,我认为它)赶上“更新”事件,并输入一堆相关的信息变成了“登录”表。
数据库确实有事务日志,但可能对您没有用处,因为我不认为它可以进行简单的查询。
一个简单的解决方案是在产品表中包含修改日期作为字段。
更新存储过程以始终使用最新生效日期的产品ID提取产品。
这将允许您有一个单独的存储过程,列出产品的所有版本。
一种方法是有2个单独的表格,例如books
和book_versions
具有相同的一组字段(作者,出版者,描述等)。
只要您的应用程序插入或更新到books
中,您就在book_versions
中插入相应的记录。这意味着books
表包含记录的最新版本,并且book_versions
包含最新和所有历史版本。如果您只对最新版本感兴趣,大多数情况下您只能通过ID从书籍中选择,并且只在需要时才检索历史记录。这是用于Ruby on Rails的acts_as_versioned
插件所使用的方法。
我建议将更新日志表添加到您的系统中。这个表只能写入,并且它有列日期,主题,谓词,对象,其中主题是作者/主体进行更改,谓词是更改的本质(创建,更新,删除),对象是事情正在改变。可能的是,您仍然可以将对象仍然分为ID,属性和值,其中ID是书籍ID,属性是要更改的属性的字符串名称,值为旧值(因为新值位于适当的表格中)。
你所要求的大部分都覆盖了"Change Data Capture" (CDC)的设计模式和"Slowly changing dimension" (SDC)的概念。
阅读关于这些主题的维基百科文章,因为它们提供了有关此主题的良好鸟瞰图。
上述任何建议的解决方案都可以使用;这实际上取决于您的工作负载和数据集大小。
如果您有很多记录,并且您只想要历史归档以供参考,那么您也可以考虑将“旧/早”版本从数据库中移出,并以某种链接列表格式(例如,插入一个包含以前版本地址的版本,从而形成一个链表),并在DB中保留一个指向最新版本的指针。
有这种方法的优缺点,但一个优点是你可以保持你的数据库小,只是从磁盘读取旧版本。您的旧版本应该是不可变的,因此您不需要依赖来自数据库的事务/并发支持。如果您的“当前/最新”数据集(比如说100G)和过去的版本是900G,那么您可以将数据库放在100G的RAID上,并将以前的版本放在更便宜的存储上,然后复制一些次(它们是原子的,所以在复制时没有并发问题)。
您可能会对temporal databases的概念感兴趣,用于描述随时间变化的事物。在时间数据库上有a freely available book,这些数据库描述了这个概念的每一个细节,但是对于更为脚踏实地的东西,您可以阅读我最喜爱的编程作者Martin Fowler的Patterns for things that change with time。
它的一个变体是两列:'active-from'和'active-to',这将允许你排队未来的产品/ offer/etc。 – 2009-08-13 12:45:51