如何设计具有修订历史的数据库? [英] How to design a database with Revision History?
问题描述
我是为我们的公共网站构建新的内容管理系统团队的成员。我正在努力寻找最简单、最好的内置修订控制机制的方法。对象模型非常基础。我们有一个抽象的BaseArticle
类,它包括版本无关/元数据的属性,如Heading
&;CreatedBy
。许多类都继承自此,例如DocumentArticle
,它具有将成为文件路径的属性URL
。WebArticle
还继承自BaseArticle
,并包括FurtherInfo
属性和Tabs
对象的集合,其中包括将保存要显示的HTML的Body
(Tab对象不从任何内容派生)。NewsArticle
和JobArticle
继承自WebArticle
。我们还有其他派生类,但它们提供了足够的示例。
我们为修订控制提供了两种持久性方法。我将这些方法1和方法2称为。我已经使用SQL Server绘制了每个元素的基本图表:
- 使用方法1,计划通过数据库更新保存
Articles
的新版本。将为更新设置触发器,并将旧数据插入xxx_Versions
表中。我认为每张桌子上都需要配置触发器。这种方法的优点是,每篇文章的head
版本只保存在主表中,而旧版本则被拆分开来。这使得将文章的标题版本从开发/临时数据库复制到Live数据库变得很容易。 - 使用方法2,计划将
Articles
的新版本插入到数据库中。文章的标题版本将通过视图确定。这似乎具有更少的表和更少的代码(例如,非触发器)的优势。
upsert_NewsArticle
将调用upsert_WebArticle
等。
我们使用的是SQL Server 2005,尽管我认为此问题与数据库风格无关。我在互联网上做了一些广泛的搜索,找到了这两种方法的参考资料。但我没有发现任何东西可以将这两个进行比较,表明两者中的一个更好。我认为,对于世界上所有的数据库书籍,这种方法的选择以前肯定已经出现过。
我的问题是:这些方法中的哪种最好,为什么?
推荐答案
一般来说,历史/审计侧表最大的优势是性能:
任何查询的实时/活动数据都可以从小得多的主表中查询
/li>任何"仅实时"查询都不需要包含Active/LATEST标志(或者上帝禁止在时间戳上执行相关子查询来查找最新行),从而简化了开发人员和DB引擎优化器的代码。
因此,对于小型CMS,只要设计更简单/代码更少/移动部件更少,方法3会更好。
方法3几乎与方法2相似,不同之处在于每个需要历史/版本控制的表都有一个显式列,其中包含TRUE/FALSE"活动"(也称为.直播-也就是。最新)-标志列。
插入行的新活动版本(或删除当前活动版本)时,向上插入负责正确管理该列。
通过在任何查询中添加"AND mytable.live = 1
",UPSERT之外的所有"活动"SELECT查询都很容易修改。
同样,希望是显而易见的,但是任何表上的任何索引都应该以"活动"列开头,除非另有保证。
此方法结合了方法2的简单性(没有额外的表/触发器)和方法1的性能(不需要对任何表执行相关子查询来查找最新/当前行-您的upserts通过active标志进行管理)
这篇关于如何设计具有修订历史的数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!