在 .NET 内容管理系统中选择 XML 还是 SQL





0/5 (0投票)
2006年5月2日
7分钟阅读

48110
本文比较了在 Web 上存储、编辑和显示结构化内容的各种方法。文章展示了使用 XML 和关系型 SQL 数据库的优点和缺点。
这是我们CodeProject赞助商的展示评论。这些评论旨在为您提供我们认为对开发人员有用且有价值的产品和服务信息。
引言
本文比较了在 Web 上存储、编辑和显示结构化内容的各种方法。文章展示了使用 XML 和关系型 SQL 数据库的优点和缺点。
选择正确的内容存储是每个动态网站的关键决定。如何存储内容?如何编辑?如何转换?本文讨论了基于 XML 和关系型 SQL 数据库的各种方法。
选择数据存储
最基本的问题显然是:我在哪里存储数据?您可以选择:
- 存储在磁盘上的 XML 文件,
- XML 数据库,
- 某些专有存储,或
- 关系型 SQL 数据库。
存储在磁盘上的 XML 文件 可以用于非常基本的网站,因为它们不提供任何数据管理功能,例如并发访问、索引、安全管理等。
虽然XML(或面向对象)数据库在某些特定情况下可能是一个最佳解决方案,但它们缺乏标准、更高的所有权成本以及市场接受度有限,很可能会让您选择其他解决方案。您也很可能不会使用专有存储,因为您想构建一个网站,而不是自己的数据库系统。
传统的(关系型)SQL 数据库似乎是一个合理的选择——它们价格合理且分布广泛。它们还针对高性能进行了优化。这使其成为通用 CMS 的正确解决方案。
存储结构化内容
既然我们已经选择了一个 SQL 数据库来存储数据和其他系统信息(如用户和权限),我们就需要选择如何在数据库中存储我们的内容。当前的内容管理系统中有两种基本方法:
- 将整个文档作为 XML 存储在单个字段中。
- 将不同类型的文档存储在单独的表中。
将文档存储为 XML
这种方法假定您将所有文档存储在一个具有单个字段来保存整个文档的数据库表中。它可能看起来像这样:
DocumentXML
字段包含像这样的 XML 文档:
<article>
<title>My first article<title>
<summary>This is a summary.</summary>
<articletext>This is full article text.</articletext>
<teaserimage>/articles/myfirst.gif</teaserimage>
</article>
将文档存储在单独的表中
如果您习惯于标准的数据库关系模式,您很可能希望为每种文档类型设置一个单独的数据库表。因此,您将拥有类似这样的数据库表:
您还可以将公共字段合并到一个 Documents 表中,同时将特定于文档类型的字段保留在单独的表中。
哪种更好?
这两种方法都有其优点和缺点。XML 方法通常更容易实现,并且对更改更灵活。它适用于半结构化内容,例如包含几个纯文本部分的页面。
如果您需要在将内容与页面设计分开的同时编辑半结构化、面向文本的内容,您将受益于此选项。您可以通过随时修改页面模板设计来简单地更改表示。
然而,当您需要在页面上显示多个 XML 文档时,可能会遇到严重问题。以产品目录为例,其中包含数十种商品:当您需要显示产品列表时,您需要遍历所有数据库记录,检索 XML 文档,解析它,然后渲染。可以想象,这并不简单,而且性能也不会是最佳的。
此外,XML 方法实际上并不支持类型化数据(如整数、日期时间等),因为所有内容都序列化为文本。如果您决定使用 XSLT 按价格对产品进行排序,您将它们作为文本排序,这将导致排序错误。您还需要确保日期时间值或十进制数字以正确的格式进行解析和显示。
对于像产品规格这样的严格结构化数据,您将受益于传统的数据库方法。它允许您轻松地从数据库中检索数据,并使用标准的 ASP.NET 控件(如 DataGrid
)将其显示在网站上,同时完全控制格式。您也可以轻松地在数据库服务器上对其进行排序或筛选,同时利用提供最佳性能的索引。然而,这种方法会导致一些挑战,我们在以下几段中讨论。
面对 SQL 挑战
传统 SQL 方法(设计上)对内容管理不够灵活。数据库结构不易更改。看看这个表:
假设您的 HR 经理希望为这个职位发布年薪。您通常需要执行以下操作:
- 添加一个表列
JobSalary
, - 修改 SQL 查询,
- 修改用于编辑内容的代码,并将薪资字段添加到编辑表单,以及
- 修改用于显示职位描述的代码。
解决此问题的方法是在代码中添加一个“元”层。与其手动编写所有代码或生成代码,不如创建一个描述数据结构或编辑表单的系统,并让内容管理引擎对其进行处理。
这是我们在Kentico CMS for .NET 中所做的:当您想为文档类型添加新字段时,只需使用基于 Web 的用户界面,然后向“Job”类型的文档添加一个新属性。您还可以指定该属性为十进制类型,并在编辑表单中将其显示为文本框。
系统会自动更新相关的数据库表。
它还会更新相关的 SQL 查询以进行 INSERT
、UPDATE
、SELECT
和 DELETE
。
当您现在编辑职位文档时,您将看到一个动态呈现的编辑表单,如下所示:
您需要进行的唯一手动编码是将适当的字段添加到表示 ASP.NET Repeater
或 DataList
的 ItemTemplate
部分的转换。
Web 上的文档看起来像这样:
工作原理
您可能会想内部是如何工作的:所有文档类型(新闻、职位、产品规格)都使用配置文件进行描述,这些文件定义了:
- 数据模式,
- 标准 SQL 查询,
- 编辑表单,以及
- 转换。
下图显示了这些元素如何协同工作:
CMS 引擎接收页面请求。它读取给定文档类型的设置(SQL 查询等)。它运行 SQL 查询从数据库中选择数据。然后,它将检索到的 DataSet
绑定到 Repeater
控件(或其他控件),该控件使用预定义的转换显示内容。页面显示给访问者。
结论
正如您所见,在内容管理领域,XML 和 SQL 方法都有其用武之地。它们都有优点和缺点,您需要根据具体情况进行选择。
现在,您可以下载 Kentico CMS for .NET 的免费试用版亲自尝试。Kentico CMS 教程将指导您完成使用面向 XML 和面向 SQL 的设计创建网页的过程。
快速链接
- Kentico CMS .NET 免费试用
- Kentico CMS 教程(PDF),适用于 VS2003 / VS2005
- 在线演示
- 使用 Kentico CMS 创建的网站
Kentico CMS for .NET 快速事实
关键内容管理功能 |
|
关键网站功能 |
|
内置模块 |
|
支持的平台 |
|
支持的 IDE |
|
支持的编程语言 |
|
支持的数据库 |
|
支持的用户界面语言 |
|
支持的内容语言 |
|
支持编辑器使用的 Web 浏览器 |
|
支持访问者使用的 Web 浏览器 |
|
其他 Kentico 产品
您可能还想尝试以下面向开发人员的 Kentico 产品:
- Kentico Compare SQL for Microsoft SQL Server - 轻松比较数据库,并查找表模式、视图、过程和函数之间的差异。
- Kentico Server Sync - 实时同步 Web 场或备份服务器之间的文件。