14

我是为我们的公共站点构建新内容管理系统的团队成员之一。我试图找到构建修订控制机制的最简单和最好的方法。对象模型非常基础。我们有一个抽象的“BaseArticle”类,它包含版本无关/元数据的属性,例如“Heading”&“CreatedBy”。一些类继承自此,例如具有属性“URL”的“DocumentArticle”,它将成为文件的路径。 “WebArticle”也从“BaseArticle”继承,包括“FurtherInfo”属性和一个“Tabs”对象集合,其中包括将要显示HTML的“Body”(Tab对象不会从任何东西派生)。 “新闻文章”和“工作条”从“网络文章”继承。我们有其他的派生类,但是这些提供了足够的例子。如何使用修订历史记录设计数据库?

我们想出了两个应用于修订控制的持久化方法。我称之为“方法1”和“方法2”。我已经使用SQL Server来做一个基本的图表:Database Diagram of Approach 1Database Diagram of Approach 2

通过Approach1,计划将通过数据库更新持久化文章的新版本。触发器将被设置为更新,并且会在xxx_Versions表中插入旧数据。我认为每个桌上都需要配置一个触发器。这种方法的优点是每篇文章的唯一“头部”版本保存在主表格中,旧版本被关闭。这使得将开发/临时数据库中的文章的头版本复制到实时数据库变得很容易。

使用Approach2,计划将新鲜版本的文章插入到数据库中。文章的头版将通过视图来识别。这似乎具有较少的表格和较少的代码(例如不是触发器)的优点。

请注意,对于这两种方法,计划将针对映射到相关对象的表(我们必须记得处理添加新文章的情况)调用Upsert存储过程。这个upsert存储过程会为它所派生的类调用它,例如upsert_NewsArticle会调用upsert_WebArticle等

我们正在使用SQL Server 2005,但我认为这个问题是独立于数据库的味道。我已经做了一些广泛的互联网拖网,并找到了两种方法的参考。但我还没有找到任何比较这两者的东西,并显示其中一个更好。我认为在世界上所有的数据库书籍中,这种方法的选择一定是以前出现的。

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

+0

您是否考虑过购买CMS并进行定制?他们看起来很难做,而且很费时。它最终可能会相当昂贵。 –

+0

当你从愿景转向实施时,它肯定会变得相当复杂。但我认为我们有技能来构建我们需要的东西......我只是想确保我们尽可能做到后端。而且,如果我们选择了现成的解决方案,我仍然会留下以下哪个方法的理论问题:-(顺便说一句,请参阅我对Blender的帖子所做的评论,以获取有趣的页面链接。 – daniel

回答

4

我认为方法2。它更简单,实施起来更容易,它提供了与方法1相同的功能。

我还能补充什么?

+1

Hi Blender,我的直觉反应与你一样 - Approach2是最简单的,但大量的意见促进了Appraoch1,请回顾[Greenspun](http://philip.greenspun.com/seia/content-management)。是在RDBMS中实施审计跟踪的两种经典方法“与我的问题相符。他并不明确,但为Approach1提供示例意味着他更喜欢它。我寻求一种平衡计算机资源与代码简单性的方法。一个正常的问题,但我希望这个特殊情况已经被彻底解决了。 – daniel

+0

顺便说一句,我已经能够找到一个架构的最发达的CMS是这个 - [架构](http://upload.wikimedia.org/wikipedia/commons/b/b7/MediaWiki_database_schema_1-17_%28r82044%29 .PNG)。他们似乎使用Approach2,但蜂巢删除了一个“Archieve”表的文章。 – daniel