如何设计具有修订历史的数据库? [英] How to design a database with Revision History?

查看:32
本文介绍了如何设计具有修订历史的数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是为我们的公共网站构建新的内容管理系统团队的成员。我正在努力寻找最简单、最好的内置修订控制机制的方法。对象模型非常基础。我们有一个抽象的BaseArticle类,它包括版本无关/元数据的属性,如Heading&;CreatedBy。许多类都继承自此,例如DocumentArticle,它具有将成为文件路径的属性URLWebArticle还继承自BaseArticle,并包括FurtherInfo属性和Tabs对象的集合,其中包括将保存要显示的HTML的Body(Tab对象不从任何内容派生)。NewsArticleJobArticle继承自WebArticle。我们还有其他派生类,但它们提供了足够的示例。

我们为修订控制提供了两种持久性方法。我将这些方法1方法2称为。我已经使用SQL Server绘制了每个元素的基本图表:

  • 使用方法1,计划通过数据库更新保存Articles的新版本。将为更新设置触发器,并将旧数据插入xxx_Versions表中。我认为每张桌子上都需要配置触发器。这种方法的优点是,每篇文章的head版本只保存在主表中,而旧版本则被拆分开来。这使得将文章的标题版本从开发/临时数据库复制到Live数据库变得很容易。
  • 使用方法2,计划将Articles的新版本插入到数据库中。文章的标题版本将通过视图确定。这似乎具有更少的表和更少的代码(例如,非触发器)的优势。
注意,这两种方法的计划都是为映射到相关对象的表调用Upsert存储过程(我们必须记住处理添加新项目的情况)。此upsert存储过程将为其派生的类调用该存储过程,例如,upsert_NewsArticle将调用upsert_WebArticle等。

我们使用的是SQL Server 2005,尽管我认为此问题与数据库风格无关。我在互联网上做了一些广泛的搜索,找到了这两种方法的参考资料。但我没有发现任何东西可以将这两个进行比较,表明两者中的一个更好。我认为,对于世界上所有的数据库书籍,这种方法的选择以前肯定已经出现过。

我的问题是:这些方法中的哪种最好,为什么?

推荐答案

一般来说,历史/审计侧表最大的优势是性能:

  • 任何查询的实时/活动数据都可以从小得多的主表中查询

    /li>
  • 任何"仅实时"查询都不需要包含Active/LATEST标志(或者上帝禁止在时间戳上执行相关子查询来查找最新行),从而简化了开发人员和DB引擎优化器的代码。

但是,对于具有100或1000行(而不是数百万行)的小型CMS,性能提升将非常小。

因此,对于小型CMS,只要设计更简单/代码更少/移动部件更少,方法3会更好。

方法3几乎与方法2相似,不同之处在于每个需要历史/版本控制的表都有一个显式列,其中包含TRUE/FALSE"活动"(也称为.直播-也就是。最新)-标志列。

插入行的新活动版本(或删除当前活动版本)时,向上插入负责正确管理该列。

通过在任何查询中添加"AND mytable.live = 1",UPSERT之外的所有"活动"SELECT查询都很容易修改。

同样,希望是显而易见的,但是任何表上的任何索引都应该以"活动"列开头,除非另有保证。

此方法结合了方法2的简单性(没有额外的表/触发器)和方法1的性能(不需要对任何表执行相关子查询来查找最新/当前行-您的upserts通过active标志进行管理)

这篇关于如何设计具有修订历史的数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆