我同意以下 cdragon 的建议以避免选项 #2。#1 和 #3 之间的选择很大程度上取决于风格。我喜欢将属性用于我认为是实体的属性,而将元素用于我认为是数据的东西。有时,很难分类。尽管如此,两者都不是“错误的”。
当我们讨论模式设计的主题时,我将添加我的两分钱,关于我喜欢的(最大)重用级别(元素和类型),这也可以促进这些实体的外部“逻辑”引用,比如说,存储在数据库中的数据字典。
请注意,虽然“伊甸园”模式模式提供了最大的重用性,但它也涉及最多的工作。在这篇文章的底部,我提供了指向博客系列中涵盖的其他模式的链接。
•伊甸园方法 http://blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx
通过全局定义所有元素来使用模块化方法,并且像 Venetian Blind 方法一样,所有类型定义都是全局声明的。每个元素都被全局定义为节点的直接子节点,并且其类型属性可以设置为指定的复杂类型之一。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="TargetNamespace" xmlns:TN="TargetNamespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified"/>
<xs:element name="BookInformation" type="BookInformationType"/>
<xs:complexType name="BookInformationType"/>
<xs:sequence>
<xs:element ref="Title"/>
<xs:element ref="ISBN"/>
<xs:element ref="Publisher"/>
<xs:element ref="PeopleInvolved" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="PeopleInvolvedType">
<xs:sequence>
<xs:element name="Author"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Title"/>
<xs:element name="ISBN"/>
<xs:element name="Publisher"/>
<xs:element name="PeopleInvolved" type="PeopleInvolvedType"/>
</xs:schema>
这种方法的优点是模式是可重用的。由于元素和类型都是全局定义的,因此两者都可以重用。这种方法提供了最大数量的可重用内容。缺点是架构冗长。当您创建通用库时,这将是一个合适的设计,在这些库中,您可以对模式元素和类型的范围以及它们在其他模式中的使用做出任何假设,特别是在可扩展性和模块化方面。
由于每个不同的类型和元素都有一个单一的全局定义,这些规范的粒子/组件可以与数据库中的标识符一对一地关联。乍一看,维护文本 XSD 粒子/组件与数据库之间的关联似乎是一项令人厌烦的持续手动任务,但 SQL Server 2005 实际上可以通过语句生成规范架构组件标识符
CREATE XML SCHEMA COLLECTION
http://technet.microsoft.com/en-us/library/ms179457.aspx
相反,为了从规范粒子构造模式,SQL Server 2005 提供了
SELECT xml_schema_namespace function
http://technet.microsoft.com/en-us/library/ms191170.aspx
ca·non·i·cal 与数学有关。(方程、坐标等)“最简单或标准形式”
http://dictionary.reference.com/browse/canonical
其他更容易构建但不太可重复/更“非规范化/冗余”的模式模式包括
•俄罗斯娃娃方法http://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx
该模式有一个单一的全局元素 - 根元素。所有其他元素和类型都嵌套得越来越深,因为每种类型都适合它上面的类型,所以给它起了名字。由于此设计中的元素是在本地声明的,因此它们不能通过 import 或 include 语句重用。
•萨拉米切片方法 http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx
所有元素都是全局定义的,但类型定义是本地定义的。这样其他模式可以重用这些元素。使用这种方法,具有本地定义类型的全局元素提供了元素内容的完整描述。此信息“切片”是单独声明的,然后重新聚合在一起,也可以拼凑在一起以构建其他模式。
•威尼斯盲人方法 http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx
与俄罗斯娃娃方法类似,它们都使用单个全局元素。Venetian Blind 方法通过全局命名和定义所有类型定义来描述模块化方法(与全局声明元素和本地类型的 Salami Slice 方法相反)。每个全局定义的类型都描述了一个单独的“slat”,并且可以被其他组件重用。此外,根据架构顶部的 elementFormDefault 属性设置,所有本地声明的元素都可以是命名空间限定的或命名空间非限定的(slat 可以“打开”或“关闭”)。