怎么样设计基于.NET的CMS数据库?

怎么样设计基于.NET的CMS数据库?

开发基于.NET的内容管理系统时,在理论上你有许多建立数据库的方法。然而,在绝大多数情况下,只有我们即将讨论的这两种方法中的某一种才管用。第一种是固定数据模型,在这种方式下,你所显示出来的内容总是包含相同的数据内容。如果你为某份报纸或者杂志建立CMS(内容管理系统),这种方法无疑是很好的一种。在第二种方法中,数据模型是一种模板驱动(template-driven)系统,数据是否被选中基于网页模板是否被选中。这种系统提供了更多的灵活性。

固定数据模型

由于你需要确保你的CMS所需的所有数据都齐全了,所以在使用固定数据模型之前你还需要做一些前期工作,即数据收集。当这一步完成后,建立逻辑数据库就很简单明了了。图A给出了一个CMS的固定数据模型的例子。

图A

怎么样设计基于.NET的CMS数据库?

固定数据模型的核心就是内容表;它包含了你的CMS中的所有内容实体。在我的新闻站点上,这些内容实体(报纸的模型)就是标题栏、来源、副标题、导言、正文和标志行。

由于我希望该系统支持基于角色(role-based)的工作流程,这样,为了处理内容的变化过程,内容表跟踪所有的帐户。内容的工作流(workflow)包括编写、编辑、批准(发行)和显示。

你可能还希望拥有控制版本的能力。我用了一种简单的方法实现了这个功能,即在数据库中保存各个版本的全部内容。你可以试一试仅仅保存版本之间变化的内容这种方法。

对数据库的设计为保存帐户的数据提供了灵活性。它仅为帐户表中的帐户保存它所需要的数据。然后,它为其它信息以该帐户ID的属性的方式保存下来。通过这样的方式,你可以为该用户在数据库中添加任何信息。例如,在你的帐户下添加电话号码,你可以给帐号ID的“家庭电话”属性赋值800-55-1234(或者任何其它电话号码)到帐户属性表中。

在本文的例子中,每一个帐户有多个角色。如,某个帐户既可以是编著者也可以是编辑。当为我们这个简单的CMS加上工作流之后,我们就可以使用这些角色。不过,过一会儿你就希望你的工作流基于角色而不是帐户,因为帐户的角色会随着时间而改变。

该数据库的另一个优点就是Notes(消息)功能。由于作者和编辑可能位于不同的大洲上,通信变得比较困难。(相信我,不同的时区会造成很大的麻烦!)Notes功能使得工作流上不同角色的通信变得简单起来。内容Notes与内容ID是相联系的,但是忽略内容的版本。

本设计允许在网站的多个栏目上显示相同的内容。但是,如果你的栏目很少,该功能也就没有什么作用了。同样的内容可以在不同的时间出现在不同的栏目里。例如,你可能希望即时新闻栏中的新闻保持时间不超过一天,但又希望新闻的保持时间稍久一些,那么上述功能就有了用武之地了。

如果你使用模板数据模型,内容实体可以在日后需要实现的时候确定。它也没有固定数据模型那样为内容实体而进行的艰难编码过程。不过,模板数据模型与固定数据模型还是有许多共同之处的,你可以在B中看到这一点。

表B

怎么样设计基于.NET的CMS数据库?

模板数据模型

这两个模型的最大共同之处就是它们处理帐户(也就是用户)的方式。它们工作方式完全相同。对模板数据模型来说,这是模板建立者的附加角色(附加任务),但是对固定数据模型来说,就是对数据库内容而不是数据库本身的附加。

在这两个模型中内容表都是数据库的基础,这也是它们的共同点。但是,模板数据模型的内容表与固定数据模型有着很大的不同,在模板数据模型中,内容表扮演了在网页模板、内容实体、Notes和显示栏目之间的枢纽角色。

在本设计中,模板建立者又一个新的角色。该角色设计网页,然后在内容实体所要出现的栏目上加入位置标志符。模板的建立工作流对应着内容实体的建立工作流,即编著、编辑、批准发行和显示。

我们已经提到,内容实体已经无需存到内容表中;内容实体将有一个自己的表(名为ContentNode)。在本模型中,你可以把相同的内容放到多个网页的模板中,这就提高了可重用性。由于每个内容实体(节点)都是自包含的(self-contained)而且有着自己的工作流,所以多个作者、多个编辑同时对同一个网页进行操作的情形是被允许的。不过,批准发行过程常常是基于整个网页而不是单个节点的——尽管这一点并不是必须的。

下面是建立模板数据模型网页的基本步骤:

  • 创建、编辑、批准发行网页。
  • 作者选择包含适当的模板(该模板包含若干正确类型的内容节点)去处理网页文章。
  • 作者创建所有内容节点。
  • 编者编辑内容节点。
  • 当所有的内容节点都准备好之后,它们可以作为一个已完成的内容页(即模板、内容节点和内容控制器)批准发行。
  • 当批准发行后,内容页就显示出来。
小结

现在你应该有了设计数据库的基本概念了。记住,如果你有固定数量的内容节点,你可以使用固定数据模型;如果节点数量很大或者文档与文档间的内容节点数是变化的,模板数据模型可能是一个更好的选择。

在我的下一篇文章中,我将讨论如何用ADO.NET去访问数据库中的数据。